1

プラットフォーム: Linux、OSX
コンパイラ: GCC

私は現在私を混乱させている単純なプログラムを持っています-私はこの問題を引き起こすためにいくつかの異なる種類の配列/ポインターをいじっていることを知っています-それは意図的です-私はそれを理解しようとしています.

リストされているコードは期待どおりにコンパイルおよび実行されますが、 or の呼び出しで変更すると、data4セグメンテーションエラーが発生します。その理由を理解したいと思います。strsep(&data4, "e");data1data3

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

int main(int c, char** v) {
    char* data1 = "hello\0";
    char* data2 = strdup(data1);
    size_t sz = strlen(data1);
    char data3[sz+1];
    char* data4;

    memset(data3, 0, sz+1);
    data4 = strncpy(data3, data1, sz);
    data4[sz] = '\0';

    char* found = strsep(&data4, "e");

    if (found == NULL) {
        printf("nothing found\n");
    } else {
        printf("found e\n");
    }

    return 0;
}
4

1 に答える 1

5

strsep(&data4, "e"); の呼び出しで data4 を変更します。data1 または data3 を変更すると、セグメンテーション違反が発生します。

この場合:

char* found = strsep(&data1, "e");

が指す文字列data1はリテラルであるため、変更できません。strsep()'\0' を配置しようとすると、segfault が発生します。

他の場合:

char* found = strsep(&data3, "e");

data3ポインターではなく配列であるため (配列はポインターに簡単に評価されますが、実際にはポインターではありません)、strsep()トークンを見つけた後に実行しようとするポインターの値を更新することはできません。これを指摘しようとして、gcc から次の警告が表示されます。

test.c:17: warning: passing argument 1 of 'strsep' from incompatible pointer type
于 2010-10-19T20:30:14.100 に答える