#include<stdio.h>
#include<string.h>
int do_print2(char *q[]);
int main()
{
char *p[]={"pointervaule","NAM", "JAM", "CALM"};
do_print2(p);
return 1;
}
int do_print2(char *p[])
{
printf("this is print1 char *p \n");
strcat(p[0],"added");
printf("%s\n", (p[0]));
return 1;
}
编译后,我试图运行它,我得到分段错误。帮助我了解错误的原因是什么。提前谢谢。
答案 0 :(得分:4)
在你的代码中:strcat(p[0],"added");
尝试在C语言中写入非法的只读内存。因为p[0]
指向一个常量字符串。
不是p
是char数组的指针,而不是2维char数组。
阅读:Difference between char* str[]
and char str[][]
and how both stores in memory?使用图表和代码示例的答案,以便更好地理解它。
答案 1 :(得分:3)
操作系统说C字符串在对象的读取部分(即不受写入)。
由于历史原因,“bla bla”实际上是一种const char * const
数据类型,但允许在C编译器中躲避一些青少年的相互依赖性。但校长(OS)不太宽容,并在走廊中驱逐此类代码的运行。 (该声明中有多少隐喻)。
答案 2 :(得分:1)
你不能写只读内存,更好的方法是这样做:
#include<stdio.h>
#include<string.h>
int do_print2(char q[][20]);
int main()
{
char p[4][20] = {{0}, {0}, {0}, {0}};
strcat(p[0],"pointervaule");
strcat(p[1],"NAM");
strcat(p[2],"JAM");
strcat(p[3],"CALM");
do_print2(p);
return 1;
}
int do_print2(char p[][20])
{
printf("this is print1 char *p \n");
strcat(p[0],"added");
printf("%s\n", (p[0]));
return 1;
}