c-分段故障运行时错误



我已经写了一段代码。如下所示。

#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;
}

最新更新