代码之家  ›  专栏  ›  技术社区  ›  neo

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

  •  0
  • neo  · 技术社区  · 11 月前

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

    #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;        
        // }
    }
    

    我对assign函数中的前3行进行了注释,并取消了对其余行的注释,尝试了一下,结果成功了。这里我只分配了两个值,但这不应该给出任何未知的行为

    1 回复  |  直到 11 月前
        1
  •  2
  •   wohlstad    11 月前

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

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

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

    那么你有三个地方 取消引用 它(使用 *i ):
    1. *i<2
    2. (*i)++
    3. arr[*i]=ele1;

    但是取消引用NULL指针会调用UB( Undefined Behavior ).

    但在任何情况下,数组的索引都不应该是指针,而应该是像这样的整数值 int .
    在注释掉的版本中 int (作为数组的索引完全有效),而不是指向的指针 int 并将其初始化为 0 正是你所需要的。

    旁注:
    assign 被声明为返回 int ,所以要么返回一些相关的值,要么将其更改为 void 作用