我正在制作一个项目,据说不知从何而来的错误,所以我进入了调试模式,找不到错误,但错误只发生在特定的地方,所以我复制了代码并运行它,错误又重复了。据我所知,我无法搜索为什么它会出错。 在下面的代码中,我尝试直接分配并且它有效,但我想知道为什么指针取消引用不起作用。
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int assign(char**,char*);
int main(){
char **arr = calloc(9,sizeof(char*));
char *ele1 = "hello1";
assign(arr,ele1);
for(int i=0;i<2;i++){
printf("%s\n",arr[i]);
}
}
int assign(char **arr,char *ele1){
for(int *i=0;*i<2;(*i)++){
arr[*i]=ele1;
}
// for(int i=0;i<2;i++){
// arr[i]=ele1;
// }
}
我注释了分配函数中的前 3 行,并取消注释了剩余的行,并尝试了它的工作。这里我只分配了 2 个值,但这不应该给出任何未知的行为
让我们分析一下这个循环:
for(int *i=0;*i<2;(*i)++){
arr[*i]=ele1;
}
int *i=0
- i
被定义为指向 int
的 pointer并初始化为 0(即,它被初始化为 NULL 指针)。
然后你可以在 3 个地方解除引用(使用
*i
):*i<2
(*i)++
arr[*i]=ele1;
但是取消引用 NULL 指针会调用 UB(未定义行为)。
在
i
中的注释版本 int
(作为数组的索引完全有效),而不是指向 int
的指针并将其初始化为 0
正是您所需要的。