此变量声明可能会产生内存问题

时间:2012-02-01 10:51:37

标签: c

这里我有一个函数,在一个应用程序中多次调用此应用程序正在连续运行。

这里我采用1024个字符数组大小。 我在这里宣布char input[1024];

这是最好的方式

1)    char input[1024];
2)    char input[1024] = NULL;

如果我们使用此功能,这件事会在很多次之后不会产生任何内存问题。char input[1024];

我想可能在使用输入后我们必须使NULL? 或者在声明中我们必须将此事件声明为char input[1024] = NULL;,以便下次调用它时,首先输入的时间为空,而不是占用任何内存。

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

void do() {

        char input[1024];

    strcat(input,"ussp-push 04:18:0F:B1:48:B5@9");
    strcat(input,"> dev/null&");

    if(system(input)  != 0)
    {
        printf("\nFailed command\n");
    }
    else
    {
            printf("\nSuccesss command\n");
    }

}

4 个答案:

答案 0 :(得分:2)

您的程序根本不会初始化input。这可能导致缓冲区溢出,即使没有发生,您的程序可能会有不正确的结果。因此,您的代码会调用未定义的行为

据推测,您实际上想要将input初始化为空字符串。像这样:

char input[1024] = "";

完成此操作后,您对strcat的通话将有效。

如果您不想初始化input,那么您可以使用strcpy代替第一个strcat

char input[1024];
strcpy(input, "ussp-push 04:18:0F:B1:48:B5@9");

如果您需要在代码中稍后将空字符串分配给input,请执行以下操作:

input[0] = '\0';

您建议的代码char input[1024] = NULL无效。它没有编译。

答案 1 :(得分:1)

由于您未在函数内部更改它,请将其设为static const数组

void dostuff() {    
    static const char input[] = "ussp-push 04:18:0F:B1:48:B5@9> dev/null&";

    if (system(input) != 0)
    {
        printf("\nFailed command\n");
    }
    else
    {
        printf("\nSuccesss command\n");
    }
}

答案 2 :(得分:0)

strcat将字符串附加到另一个字符串,为此,它在目标字符串中搜索终结符char(\ 0)。由于您没有初始化目标字符串,因此它可能会也可能找不到\ 0。

只需初始化它,例如:

input[0]='\0';

答案 3 :(得分:0)

这不会导致内存问题。每次调用do()时,将在堆栈上分配1024字节的数组;该内存将用于调用input 中的do()。当do()返回时,将释放1024个字节,并在下次调用时分配(概念上)新的1024个集合。

在任何情况下char input[1024] = NULL;都不是有效代码。如果您想初始化input,请尝试使用char input[1024] = "";之类的内容。