gpt4 book ai didi

c - 在 C 中使用指针时,何时以及为何需要使用 malloc?

转载 作者:行者123 更新时间:2023-11-30 20:03:28 24 4
gpt4 key购买 nike

 /* 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 分配任何内容,则它包含一些垃圾值。尝试取消引用指针(即访问指针指向的内容)(使用数组索引隐式执行此操作)意味着您正在尝试读取/写入一些不应该读取的任意内存位置。

尝试使用无效指针会调用 undefined behavior 。这意味着您的程序可能会崩溃,可能会输出奇怪的结果,或者可能看起来工作正常。此外,进行看似无关的更改(例如额外调用 printf 进行调试、添加未使用的变量或使用不同的优化设置进行编译)都可能会改变未定义行为的表现方式。

因此,仅仅因为程序似乎运行正常并不意味着没有问题。这只是意味着它可能会在您最意想不到的时候出现。

指针需要先指向某个有效的内存位置,然后才能使用它。调用malloc 分配一 block 内存并返回指向该内存的指针。将该地址分配给 ans 后,您可以使用它来读取/写入分配的内存。这保证了您的程序将被明确定义。

关于c - 在 C 中使用指针时,何时以及为何需要使用 malloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51567609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com