【问题标题】:Getting seg fault when trying to decrement my environment variable in C尝试在 C 中减少我的环境变量时出现段错误
【发布时间】:2016-05-10 08:46:02
【问题描述】:

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

代码导致“Segmentation fault (core dumped)”,我相信是在调用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);
}

【问题讨论】:

    标签: c segmentation-fault printf


    【解决方案1】:

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

    改为这样做:

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

    【讨论】:

    • 使用snprintf 并确保您永远不会超出该数组的范围会非常棒。
    【解决方案2】:
    sprintf_wrapper(new_env, whale);
    

    您正在附加到一个字符串文字,它是只读内存。

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

    str = "WHALE=";
    

    这是一个只读字符串字面量。

    【讨论】:

      猜你喜欢
      • 2020-09-26
      • 2022-01-12
      • 2020-10-04
      • 2023-01-16
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 2021-07-30
      相关资源
      最近更新 更多