分段故障运行时错误

时间:2013-07-18 20:46:54

标签: c pointers segmentation-fault function-pointers

我写了一段代码。这看起来如下。

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

}

编译后,我试图运行它,我得到分段错误。帮助我了解错误的原因是什么。提前谢谢。

3 个答案:

答案 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;

}