考虑以下计划:
#include <stdio.h>
void foo(char** string)
{
printf("%s", string[0]);
}
int main()
{
char* a = "blahblah";
foo(&a);
return 0;
}
它可以正常工作,但如果我替换
char* a = "blahblah";
与
char a[] = "blahblah";
它不起作用。
我收到警告expected 'char **' but argument is of type 'char (*)[9]'
和分段错误。
我的印象是char[]
和char*
是相同的,所以指向它们的指针也是一样的。
(带有mingw的窗口,gcc 4.8.1)
谢谢
答案 0 :(得分:3)
在大多数情况下,这两个语句的行为相同,但有两个例外。一个例外是在应用&amp;运营商。当你申请&amp;对于一个数组(例如a []),你得到了整个数组的地址。该值与数组的第一个元素的地址相同,因此&amp; a == a(它们的类型不同很难)。您可以在此处尝试一个简单示例:http://ideone.com/96w3oa
确定。现在我们可以看到为什么你有一个分段错误。因为&amp; a等于a,你的字符串[0]实际上做了额外的尊重。正确的方法是:
printf("%s", string);
或
printf("%s", (&string)[0]);
如果您使用
char a[] = "blahblah";
有关您尝试的两个陈述之间差异的更多信息,请参阅此帖(特别是John Bode的帖子):What is the difference between char s[] and char *s?。
这也是一个非常好的解释: http://publications.gbdirect.co.uk/c_book/chapter5/arrays_and_address_of.html
答案 1 :(得分:0)
当你将数组传递给foo函数时,你应该这样做。
#include<stdio.h>
void display(char *);
int main()
{
char arr[]="Do something";
display(arr);
return 0;
}
void display(char *string)
{
printf("%s",string);
}
否则您可能会遇到分段错误。使用&amp; array_name时,您实际上会传递起始元素的地址。