7

以下のコードの行:

*end = *front;

セグメンテーション違反を与えます。ここで同様の質問をしましたが、num のコピーが 2 つあるためかどうかはわかりません。seg-faulting の理由を説明してください。ありがとうございました。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* getPalin(char* num);

int main()
{
    char* num = (char*)malloc(100);

    num = "123456";

    printf("%s\n", getPalin(num) );

    return 0;
}

char* getPalin(char* num)
{
    int length = strlen(num);

    if ( length % 2 == 0 )
    {
        char* front = num;
        char* end = num + strlen(num) - 1;  //pointer to end

        while( front != num + (length/2) )  //pointers not middle yet
        {
            *end = *front;

            printf("%c", *end);

            front++;
            end--;
        }
    }

    return num;
}
4

4 に答える 4

19

これらの 2 行:

char* num = (char*)malloc(100);
num = "123456";

以下の効果があります。

1 つ目は 100 バイトを割り当てnum、それらのバイトを指すように設定します。

2 つ目は、ほぼ確実に読み取り専用メモリにある文字列 "123456" を指すように num を変更します。

読み取り専用メモリの内容を変更しようとすると、セグメンテーション違反が発生します。文字列を変更する前に、次のように文字列をmalloc'dにコピーする必要があります。num

strcpy (num, "123456");

それは、現在持っている場所にあるはずの行です。

num = "123456";
于 2009-06-03T06:28:25.583 に答える
4

使用する

strncpy(num, "123456", 100);

それ以外の

num = "123456";
于 2009-06-03T06:24:16.137 に答える
0

エラーの理由は次のとおりです。

  char* num = (char*)malloc(100);

この行では、文字列としてではなく、配列へのポインターまたは最初の要素へのポインターとして num を宣言しています。

 num = "123456";

この行は、文字列として宣言したときに num を使用しました。これはセグメンテーションに違反しているため、セグメンテーション違反です。コードの好ましい(正しい)構文は次のとおりです。

   char num[100];
   strcpy(num,"123456"); //Even if you use num="123456"; here it would still be wrong

また

  char* num = (char*)malloc(100);
  strcpy(num,"123456");

また

  char num[100]={'1','2','3','4','5','6'};

これらのいずれかがあなたの仕事をします。

于 2012-10-13T21:04:27.567 に答える