很抱歉,如果这是一个先发制人的问题,但我对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;
}
我如何安全地避免此问题?谢谢你的帮助。
答案 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数组数据