/* Note: The returned array must be malloced,
assume caller calls free(). */
int* twoSum(int* nums, int numsSize, int target) {
int *ans; //why error
for(int i = 0; i < numsSize; i++){
for(int j = i+1; j < numsSize; j++){
if(nums[i] + nums[j] == target){
ans[0] = i;
ans[1] = j;
break;
}
}
}
return ans;
}
为什么上面的代码不正确而下面的代码正确(malloc
添加)?
/* Note: The returned array must be malloced,
assume caller calls free(). */
int* twoSum(int* nums, int numsSize, int target) {
int *ans = (int*)malloc(2*sizeof(int)); //why not error
for(int i = 0; i < numsSize; i++){
for(int j = i+1; j < numsSize; j++){
if(nums[i] + nums[j] == target){
ans[0] = i;
ans[1] = j;
break;
}
}
}
return ans;
}
如果您不为 分配任何内容ans
,则它包含一些垃圾值。尝试取消引用指针(即访问指针指向的内容),使用数组索引隐式执行的操作意味着您正在尝试读取/写入一些您不应该读取的任意内存位置。
尝试使用无效指针会调用未定义的行为。这意味着您的程序可能会崩溃,可能会输出奇怪的结果,或者可能看起来工作正常。此外,进行看似无关的更改,例如额外调用printf
调试、添加未使用的变量或使用不同的优化设置进行编译,都可以改变未定义行为的表现方式。
因此,仅仅因为程序似乎运行正常并不意味着没有问题。这只是意味着它可能会在您最不期望的时候出现。
指针需要指向某个有效的内存位置才能使用它。调用malloc
分配一块内存并返回一个指向该内存的指针。将该地址分配给 后ans
,您可以使用它来读取/写入分配的内存。这保证了您的程序将得到很好的定义。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句