0

Achar**さんはいつも私を混乱させます。次のコードは、セグメンテーション違反を生成します。説明してください...

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

int main()
{
    char** nameList;
    nameList = malloc(4*sizeof(char*));
    nameList[0] = malloc(12); //not sure if needed but doesn't work either
    nameList[0] = "Hello "; 
    printf("%s  ",nameList[0]);// even this statement isn't executed
    strcat(nameList[0], "World");
    printf("%s ",nameList[0]);
    return 0;
}
4

3 に答える 3

3

あなたが持った後nameList = malloc(4*sizeof(char*));: nameList[0] = ゴミ箱 nameList[1] = ゴミ箱 nameList[2] = ゴミ箱 nameList[3] = ゴミ箱

nameList nameList[0] = "Hello ";[0] = "Hello" nameList[1] = ごみ nameList[2] = ごみ nameList[3] = ごみ

strcat(nameList[1], "World");nameList[1] はメモリ内の任意の場所を指している可能性があるため、これを行うとセグメンテーション違反が発生する可能性が非常に高くなります。

于 2013-08-24T01:10:49.377 に答える
1

あなたのコードは、読み取り専用ストレージに書き込み、さらにその末尾を超えて書き込みを試みることにより、未定義の動作を示します。

あなたのmallocアイデアは正しい方向への一歩でした。ただし、新しく割り当てられたメモリstrcpyにコピーするために使用する必要があります。"Hello"さらに、動的割り当てのサイズを計算するときは、追加する予定の文字列のサイズと null ターミネータを考慮する必要があります。

明らかに、プログラムの最後に割り当てられたすべてのメモリを解放する必要もあります。

char** nameList;
nameList = malloc(4*sizeof(char*));
nameList[0] = malloc(12);
strcpy(nameList[0], "Hello ");
printf("%s  ",nameList[0]);
strcat(nameList[0], "World"); // You were strcat-ing into a wrong element
printf("%s ",nameList[0]);
free(nameList[0]);
free(nameList);

ideone のデモ

于 2013-08-24T01:10:33.473 に答える
0

ダブルptrを使用する前に、単一ptrを使用するコードを取得してください。また、単純なコードを「オーバープログラミング」したくありません。ただし、double ptr の使用法をプログラムする場合は、このコードから始めて、double ptr を使用するように変更します。

int main()
{
        char *nameList;

        nameList = malloc(12);   // point nameList to 12 bytes of storage

        strncpy(nameList, "Hello \0", 7);
        printf("%s\n",nameList);   // notice no space, its already after hello

        strncat(nameList, "World", 5);
        printf("%s\n",nameList);

        free(nameList);

        return 0;
}
于 2013-08-24T04:16:42.620 に答える