2

我编写了一个简单的函数来将C字符串(不是 C++)制作成execvpLinux 中的函数向量。

这是我的代码:

#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 = ' '

我无法理解为什么程序在程序更改时收到信号 SIGSEGVcstring

4

2 回答 2

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

是一个字符串文字,修改它是未定义的行为char *flag = cstring;表示flag指向与 . 相同的位置(恰好是只读内存)p。你试图做的事情(就像现在一样)是非法的。

尝试

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 回答