C打印相同的阵列使用两种方法产生不同的结果

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

我正在试验C void函数和字符串。我试过这个程序:

#include <stdio.h>
#include <string.h>

void print(char** test);
int main(){
    char* test = "abcdef";
    print(&test);
    return 0;
}
void print(char** test){
    for(int i=0;i<strlen(*test);i++)
        printf("%c\n",*test[i]);
}

它为我打印了第一个a A �然后分段故障。但是在将*test[i]改为*(*test+i)之后,这对我来说几乎是同样的事情。

如果不是,有什么微妙的区别*test[i]*(*test+i),为什么我的代码在第二个例子中起作用,同时它不在第一个?

c pointers
1个回答
4
投票

test是一个char**。正如一些程序员老兄评论的那样,[]优先于*所以你的for循环执行如下:

  1. *test[0] == *(test[0]) == 'a'
  2. *test[1] == *(test[1]) == *(在&test之后保存在内存中的其他一些地址)=> UB

要么在整个程序中使用一个间接(即*,而不是**和&test),要么使用(*test)[i]

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