c - 未使用的变量影响程序

标签 c variables

我必须为大学编写一个小的 c 程序,它应该在命令行上再次打印给定的参数。任务是用指针来完成。 所以我的问题是,当未使用的变量“bin”是代码的一部分时,程序完全正确。但是,如果我尝试删除代码或将其注释掉,程序将不再运行(它崩溃或不打印任何内容)...但是程序中根本没有使用该变量。我也可以更改它的名称,但不能更改它的声明值。也许有人可以帮助/解释问题所在:) 谢谢!

代码:

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

int main (int argc, char *argv[])
{
    char *text;
    char bin = '\0'; //<---- unused variable
    char space = 32;
    int i = 0;

    if(argc == 1){
        printf("Bitte Parameter mit angeben!");
        return 1;
    }

    text = malloc(sizeof(char));

    for(i = 1; i < argc; i++){
        text = realloc(text, sizeof(char) * (strlen(argv[i]) + 2 + 
               strlen(text)));
        if(text == NULL)
            return 1;
        text = strcat(text, argv[i]);
        text = strcat(text, &space);
    }

    text++;
    printf("%s", text);
    free(text);
    return 0;
 }

最佳答案

您的代码连接到 text 而不初始化 text。您需要以 text 作为空字符串开始:

text = malloc(sizeof(char));
text[0] = `\0` ; // empty string

然后将 &space 传递给 strcat() 是错误的,因为 space 不是以 nul 结尾的字符串。只需替换为:

text = strcat(text, " " ) ;

然后稍后删除 text++ 否则它会省略第一个字符,并且您不能 free() 修改后的指针而不会导致堆错误:

// text++;   <<< NOT NEEDED and makes free(text) bound to fail.
printf("%s", text);
free( text ) ;

为什么它与 bin present 一起工作是因为你很幸运,并且由于堆栈上的邻接,它恰好形成了 &space 的 nul 终止符。您再次幸运地看到任何未初始化的 text 指向的内容,并且释放修改后的指针可能不会导致错误或故障,因为程序结束时没有尝试分配任何进一步的内存。

关于c - 未使用的变量影响程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48066397/

相关文章:

variables - 在经典ASP中传递变量

c - 查找回文,不适用于 fgets

javascript - 是否可以将带有变量的方程的字符串转换为方程?

Java Android : Set variable from AsyncTask?

javascript - 如何使用javascript移动图像

javascript - 为什么 jslint 更喜欢在 javascript 中拆分变量声明?

c - 如何将 utf8 字符串转换为 ascii 字符串?

c - 干掉这个代码片段(不要弄脏命名空间太多)

c - assembly 功率(A,b)功能

c++ - n 位有符号数,其中 n 不是 2 的幂