尝试在C中减少环境变量时出现seg错误

时间:2016-02-01 19:10:22

标签: c segmentation-fault printf

这里的总C菜鸟。我知道我的sprintf_wrapper方法有问题,因为在我介绍它之前一切正常。该函数的要点是获取字符串缓冲区和数字,并将字符串缓冲区值更改为“WHALE = [num]”。然后我使用putenv方法使用这个新字符串。

代码导致“分段错误(核心转储)”,我相信它是在调用sprintf_wrapper之后发生的。

主要方法

int main(void) {
    getP0Info();
    putenv("WHALE=7");
    forkProcesses();

    int whale = atoi(getenv("WHALE"));
    char new_env[50];
    sleep(1);
    printf("P0: %d\n", whale);
    whale = whale - 1;
    sprintf_wrapper(new_env, whale);
    putenv(new_env);

    return 0;
}

sprintf_wrapper

void sprintf_wrapper(char* str, int num) {
    char buffer[10];
    str = "WHALE=";
    sprintf(buffer,"%d", num);
    strcat(str,buffer);
}

2 个答案:

答案 0 :(得分:2)

您正在为str变量分配字符串常量,然后尝试附加到该变量。因为字符串常量通常存在于只读内存中,所以这通常会导致核心转储。

请改为:

void sprintf_wrapper(char* str, int num) {
    sprintf(str,"WHALE=%d", num);
}

答案 1 :(得分:0)

sprintf_wrapper(new_env, whale);

您要附加到字符串文字,这是只读内存。

这会产生分段错误,因为您写入了不应写入的内存。

str = "WHALE=";

这是一个只读字符串文字。