为什么我不能通过取消引用 int 指针作为索引来访问 char 指针数组中的位置

问题描述 投票:0回答:1

我正在制作一个项目,据说不知从何而来的错误,所以我进入了调试模式,找不到错误,但错误只发生在特定的地方,所以我复制了代码并运行它,错误又重复了。据我所知,我无法搜索为什么它会出错。 在下面的代码中,我尝试直接分配并且它有效,但我想知道为什么指针取消引用不起作用。

#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 个值,但这不应该给出任何未知的行为

arrays c pointers multidimensional-array char
1个回答
0
投票

让我们分析一下这个循环:

for(int *i=0;*i<2;(*i)++){
    arr[*i]=ele1;       
}

int *i=0
-
i
被定义为指向 int
pointer
并初始化为 0(即,它被初始化为 NULL 指针)。

然后你可以在 3 个地方解除引用(使用

*i
):
(1)
*i<2

(2)
(*i)++

(3)
arr[*i]=ele1;

但是取消引用 NULL 指针会调用 UB(未定义行为)。

i
中的注释版本
int
(作为数组的索引完全有效),而不是指向
int
的指针并将其初始化为
0
正是您所需要的。

© www.soinside.com 2019 - 2024. All rights reserved.