C中的字符串起始状态

时间:2012-02-23 10:45:26

标签: c string memory initialization

很抱歉,如果这是一个先发制人的问题,但我对C很新。我正在使用GCC编译器。当我写一个带有字符串的程序时,如果字符串超出一定的长度,它似乎从一些内容开始。我担心只是覆盖它,因为它可能被另一个程序使用。以下是显示问题的示例代码:

#include <stdio.h>
// Using the GCC Compiler
// Why is there already something in MyString?
int main(void) {
    char MyString[250];

    printf("%s", MyString);
    getch();
    return 0;
}

我如何安全地避免此问题?谢谢你的帮助。

5 个答案:

答案 0 :(得分:5)

  

为什么MyString中已存在某些内容?

myString没有初始化,可以包含任何内容。

初始化为空字符串:

char MyString[250] = { 0 };

unwind在答案中指出:

char MyString[250] = "";

更具可读性(并与以下内容一致)。

初始化为字符串:

char myString[250] = "some-string";
  

我担心只是覆盖它,因为它可能被另一个程序使用

程序的每个正在运行的实例都有自己的myString

答案 1 :(得分:2)

问题是您的字符串未初始化。

一个C-String以'\ 0'结尾,所以你应该简单地添加像

这样的东西
MyString[0] = '\0';
宣言背后的

。这样,您可以确保像printf这样的函数按照您期望的方式工作。

答案 2 :(得分:2)

由于某些原因,许多人建议

的数组样式初始化
char myString[50] = { 0 };

但是,由于此数组旨在用作字符串,因此我发现使用字符串初始化程序更清晰,更直观(并且语法更简单):

char myString[50] = "";

这是完全相同的事情,但是使你想要初始化数组的内容更加清晰,实际上是一个空字符串。

您在“随机”数据中看到的情况就是数组中发生的情况,因为您没有初始化它只是得到了那里发生的事情。这意味着某些其他程序正在同时使用该内存,因此您无需担心这一点。但需要担心将指针移交给char的数组,但该数组没有正确地0终止到任何期望字符串的C函数。

从技术上讲,您正在调用未定义的行为,这是您应该避免的。它很容易导致你的程序崩溃,因为没有人知道你的内存可能会有多远。操作系统可以自由地杀死试图访问他们不允许触摸的内存的进程。

正确地将数组初始化为空字符串可以避免此问题。

答案 3 :(得分:0)

char MyString[250] = {0};

但是好用

std::string

答案 4 :(得分:0)

由于您已将char数组初始化为任何值,因此它将包含一些垃圾值。使用类似的东西是一个很好的编程习惯:

char MyString [250] =“我的数组”; //如果您知道要使用的数组

char MyString [250] ='\ 0'; //如果您不打算在初始化期间填充char数组数据