1

i have written a code . this looks as follows .

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

}

after compilation, i am trying to run it, i am getting segmentation fault. help me in learning what is the reason for that error. thank in advance.

4

3 回答 3

4

在您的代码中:strcat(p[0],"added"); 尝试在 C 中非法的只读内存上写入。因为p[0]指向一个常量字符串。

Notp是指向 char 数组的指针,但不是二维 char 数组。

阅读:两者在内存中存储的区别char* str[]以及char str[][]如何存储?带有图表和代码示例的答案,以更好地理解它。

于 2013-07-18T20:48:14.483 回答
3

操作系统表示 C 字符串位于对象的读取部分(即防止写入)。

由于历史原因,“bla bla”实际上是一种const char * const数据类型,但在 C 编译器的眼中可以摆脱一些青少年的相互依赖关系。但是校长 (OS) 不那么宽容,并驱逐了在走廊中运行此类代码。(该陈述中有多少隐喻)。

于 2013-07-18T20:54:07.267 回答
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;

}
于 2013-07-18T21:45:31.980 回答