我正在试验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)
,为什么我的代码在第二个例子中起作用,同时它不在第一个?
test
是一个char**
。正如一些程序员老兄评论的那样,[]
优先于*
所以你的for循环执行如下:
*test[0] == *(test[0]) == 'a'
*test[1]
== *(test[1])
== *(在&test
之后保存在内存中的其他一些地址)=> UB要么在整个程序中使用一个间接(即*,而不是**和&test
),要么使用(*test)[i]