5

gcc 4.4.3 c89

私は次のソースコードを持っています。そして、printfでスタックダンプを取得します。

char **devices;
devices = malloc(10 * sizeof(char*));

strcpy(devices[0], "smxxxx1");

printf("[ %s ]\n", devices[0]); /* Stack dump trying to print */

このようなchar配列を作成する必要があると思います。

devices[0]
devices[1]
devices[2]
devices[4]
etc

そして、各要素に文字列を格納できます。

提案をありがとう、

==修正を追加===

for(i = 0; i < 10; i++)
{
    devices[i] = malloc(strlen("smxxxx1")+1);
}
4

6 に答える 6

5

ポインタの配列にメモリを割り当てました。文字列を格納するには、各要素にメモリを割り当てる必要があります

例えば

#define NUM_ELEMENTS 10
char **devices;
devices = malloc(NUM_ELEMENTS  * sizeof(char*));

for ( int i = 0; i < NUM_ELEMENTS; i++)
{
    devices[i] = malloc( length_of string + 1 );
}
于 2010-05-12T08:59:52.793 に答える
4

devices [0]はですがchar *、ストレージを割り当てていません。代わりにこれを行ってください:

char **devices;
devices = malloc(10 * sizeof(char*));

devices[0] = strdup("smxxxx1");

printf("[ %s ]\n", devices[0]);

最終的には、次の方法で割り当てられたメモリを解放する必要がありますstrdup()

free(devices[0]);
于 2010-05-12T08:59:55.553 に答える
3

10文字のポインタを格納するためのメモリを割り当てました。これらのメモリ位置に文字列を格納するには、それぞれにメモリを割り当てる必要があります。device[0] = malloc(stringLen + 1);基本的に、各ポインタのようなものが必要です。

于 2010-05-12T08:59:46.383 に答える
2

ポインタの配列を文字配列に割り当てただけです。保存する予定の文字列ごとにメモリを割り当てる必要があります。

char **devices;
devices = malloc(10 * sizeof(char*));

//Added this line:

devices[0] = (char*)malloc(strlen("smxxxx1")+1);
strcpy(devices[0], "smxxxx1\0");

printf("[ %s ]\n", devices[0]); /* Stack dump trying to print */
于 2010-05-12T08:59:27.270 に答える
1

ポインタ(デバイス)にスペースを割り当てましたが、格納する文字列にスペースを割り当てていません。

于 2010-05-12T08:58:28.987 に答える
0

デバイスはポインタの配列です。要素0を文字列を指すように設定するように見える場合は、文字列"smxxxx1"を配列にコピーしています。

strcpy()の代わりに、次のことを試してください。

devices[0] = "smxxxx1"

また

devices[0] = strdup("smxxxx1")

編集:

32ビットシステムでは、devices[0]は4バイトで構成されます。これらの4バイトは、文字列「smxxxx1」の最初の4文字のバイト値で上書きされています。アスキーでは、これらは0x73、0x6D 、0x78、0x78です。リトルエンディアンのアドレス指定を想定すると、アドレス0x78786D73へのポインタを含むdevices[0]になります。このアドレスは、プロセス内ではほぼ確実に有効ではありません。printf()の呼び出しがこの無効なポインターを逆参照しようとすると、OSはセグメンテーション違反をトリガーし、コアをダンプします。

問題は、OPが初期化時にデバイス変数を文字列(charの配列)として誤って処理していたことでした。実際にはcharへのポインタの配列であり、printf()はそれをそのように解釈しています。

于 2010-05-12T09:02:34.880 に答える