2

CLinuxで関数のベクトルに文字列 (C++ ではない) を作成する単純な関数を作成しますexecvp

これは私のコードです:

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

char** vecting(char *cstring) {

    int w_count = 0;           //word count
    char *flag = cstring;

    while (*flag != '\0') {
        if (*flag == ' ' || *flag == '\n' || *flag == '\t')
            *flag = '\0';
            flag++;
        else {
            w_count++;
            while (*flag != ' ' && *flag != '\n' && *flag != '\t' && *flag != '\0')
                flag++;
        }
    }

    char **cvector = (char **)malloc(sizeof(char *)*(w_count+1));
    cvector[w_count] = NULL;
    int v_count;                //vector count

    for (v_count = 0, flag = cstring; v_count < w_count; v_count++) {
        while (*flag == '\0')
            flag++;
        cvector[v_count] = flag;
        while (*flag != '\0')
            flag++;
    }
    return cvector;
}

int main()
{
    char *p = "This is a BUG";
    char **argv = vecting(p);
    char **temp;

    for (temp = argv; *temp != NULL; temp++)
        printf("%s\n", *temp);
    return 0;
}

実行すると、Segmentation fault.

それから私はそれをデバッグします, 私はちょうど見つけました, 実行すると

*flag = '\0'; //(in line 12)

プログラム受信信号 SIGSEGV、セグメンテーション違反。

その時*flag = ' '

プログラムの変更時にプログラムがシグナル SIGSEGV を受信した理由がわかりませんでしたcstring

4

2 に答える 2

6
char *p = "This is a BUG";

は文字列リテラルであり、それを変更する動作は未定義です。は、 と同じ場所 (たまたま読み取り専用メモリ) を指すことをchar *flag = cstring;意味します。あなたがやろうとしていることは (現在のように) 違法です。flagp

試してみてください

char p[] = "This is a BUG"; 
于 2012-05-27T14:42:41.573 に答える
1

SIGSEGVを取得する原因は、"This is the bug"文字列がconstセクションに配置されたことです。プログラムがロードされると、対応するメモリ領域が読み取り専用としてマークされます。プログラムが読み取り専用メモリ領域に書き込もうとすると、セグメンテーション違反が発生します。

于 2012-05-27T14:45:37.403 に答える