#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *abc = "abc";
char *new_str;
new_str = getStr(&abc);
printf("%s", abc);
}
char *getStr(char *str)
{
printf(str);
return str;
}
上面的代码出了什么问题?
答案 0 :(得分:6)
一堆小东西:
您已将&abc
传递给getStr()
。 &abc
是指向保存字符串的变量的指针。它的类型是一个指向指针的指针,它与getStr()的char *str
参数不兼容。
您的getStr()
在使用后定义。您需要将其定义移至main()
之前或在main()
之前添加原型。
"abc"
等字符串文字的类型为const char *
。您正在定义类型char *
的变量,这是可疑的(因为它允许您修改字符串文字,这是不允许的。)
答案 1 :(得分:3)
这是一个工作版本:
#include <stdio.h>
#include <stdlib.h>
char *getStr(char *str);
int main(void)
{
char *abc = "abc";
char *new_str;
new_str = getStr(abc);
//printf("%s", *abc); don't really need this
}
char *getStr(char *str) {
printf("%s", str);
return str;
}
以下是旧问题的列表:
答案 2 :(得分:2)
C字符串是指向一个字符的指针,该字符以一个以空字节结尾的字符序列开始。变量abc完全符合这个定义。
此外,abc是指向字符的类型指针。您正在传递abc的地址,即getStr将接收指向字符的指针的地址 - 因此getStr的唯一参数应该是指向字符指针的类型指针。类型不匹配。
编辑:此外,getStr在声明之前被调用。您的编译器可能允许这样做,但由于许多原因这是不好的做法。您应该在使用之前声明它或定义它。如果您使用gcc作为编译器,请始终使用
gcc -ansi -Wall -pedantic
这三个标志符合ANSI标准,它会因上述问题而对你大喊大叫或不编译。
答案 3 :(得分:0)
你的getStr函数接受一个char *,但这不是你传递的东西 - 你传递的是指针的地址,而不是传递实际的指针。
变化:
new_str = getStr(&abc);
为:
new_str = getStr(abc);
我认为它会起作用。