/* 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;
}
答案 0 :(得分:3)
如果您没有为ans
分配任何内容,它将包含一些垃圾值。尝试取消引用指针(即访问指针所指向的对象)的操作,这是隐式地使用数组索引执行的,这意味着您正在尝试读取/写入一些您不应使用的任意内存位置。
尝试使用无效的指针会调用undefined behavior。这意味着您的程序可能会崩溃,可能会输出奇怪的结果,或者它似乎可以正常运行。另外,进行看似无关的更改,例如额外调用printf
进行调试,添加未使用的变量或使用不同的优化设置进行编译,都可以更改未定义行为的显示方式。
所以仅仅因为程序似乎表现正常,并不意味着没有问题。这只是意味着它可能会在您最不期望的时候出现。
在使用指针之前,需要先指向一些有效的内存位置。调用malloc
会分配一个内存块,并返回一个指向该内存的指针。将地址分配给ans
之后,您就可以使用它来读取/写入分配的内存。这样可以保证您的程序定义正确。