我已经写了一段代码。如下所示。
#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("%sn", (p[0]));
return 1;
}
编译后,我试图运行它,我得到了分段错误。帮助我了解那个错误的原因。提前感谢。
在您的代码中:strcat(p[0],"added");
尝试在只读内存上写入在C中是非法的。因为p[0]
指向一个常量字符串。
不是p
是指向字符数组的指针,但不是二维字符数组。
阅读:char* str[]
和char str[][]
的区别以及两者在内存中的存储方式?用图表和代码示例给出答案,以便更好地理解它。
操作系统表示C字符串位于对象的读取部分(即受保护不写入)。
由于历史原因,"bla-bla"实际上是一种const char * const
数据类型,但在C编译器眼中,它可以摆脱一些青少年之间的相互依赖关系。但校长(OS)则不那么宽容,并拒绝在走廊里运行此类代码。(那句话中有多少隐喻)。
你不能写只读内存,更好的方法是:
#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("%sn", (p[0]));
return 1;
}