1

私はコードを書いています。これは次のようになります。

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

}

コンパイル後、実行しようとしていますが、セグメンテーション違反が発生しています。そのエラーの理由が何であるかを知るのを手伝ってください。少し早いですがお礼を。

4

3 に答える 3

4

コードstrcat(p[0],"added"); 内: C では違法な読み取り専用メモリに書き込もうとしp[0]ます。定数文字列を指しているためです。

char 配列へのポインタではなくp、2 次元の char 配列ではありません。

読む:との違いchar* str[]char str[][]両方がメモリに保存される方法は? それをよりよく理解するために、図とコード例を含む回答。

于 2013-07-18T20:48:14.483 に答える
3

OS は、C 文字列がオブジェクトの読み取りセクションにある (つまり、書き込みから保護されている) ことを示します。

歴史的な理由により、"bla bla" は実際にはconst char * constデータ型ですが、C コンパイラの目から見て、10 代の相互依存関係を回避することが許可されています。しかし、校長 (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 に答える