我的程序中有很多数组都有这个问题,我无法理解为什么。我想我对阵列理论有所遗漏。
“有人”在我的数组的末尾添加了某些字符,例如?^)(&%。例如,如果我有一个带有“hello”的长度为5的数组,那么它已满,有时会打印你好吗?()/& %%。如果它是10个元素并且我只使用5个,我可以发现它不会发生,所以也许其他5个元素得到一些随机值,但是如果它已满,那么地狱会得到那些奇怪的值?
我通过manaully添加字符'\ 0'来部分解决它。
例如,当我尝试从另一个数组填充数组时,会出现此问题(我从fgets读取一行测试文件,然后我必须提取单个单词):
...
for(x=0;fgets(c,500,fileb);x++) { // read old local file
int l=strlen(c);
i=0;
for (k=0;k<(l-34);k++) {
if(c[k+33]!='\n') {
userDatabaseLocalPath[k]=c[k+33];
}
}
由于
答案 0 :(得分:5)
C中的字符串由值为0的字符终止,通常称为字符文字,即'\0'
。
大小为5的字符数组不能保存字符串hello
,因为终结符不适合。期望终结者的功能将会混淆。
要声明一个包含字符串的数组,最好使用的语法是:
char greeting[] = "hello";
这样,您不需要指定长度(计算字符数),因为编译器会为您执行此操作。而且你也不需要包含终止符,它会自动添加,所以上面会在内存中创建它:
+-+-+-+-+-+--+
greeting: |h|e|l|l|o|\0|
+-+-+-+-+-+--+
你说你有“从另一个更长的阵列填充一个数组”的问题,这听起来像一个大多数被称为字符串复制的操作。由于字符串只是带有终止符的数组,因此除非您知道有更多空格,否则不能盲目地将较长的字符串复制到较短的字符串上。
鉴于上述情况,此代码将调用未定义的行为:
strcpy(greeting, "hi there!");
因为被复制到greeting
数组的字符串比数组所占空间的长。
这通常通过使用“已知足够大”缓冲区或添加手动跟踪所用空间的检查来避免。有一个名为strncpy()
的函数可以做到这一点,但是我不建议使用它,因为它的确切语义非常奇怪。
答案 1 :(得分:0)
你正面临着数组边界限制的问题..如果数组的大小为5,那么第\0
位的第六个位置就没有必要是安全的了。因为它不是内存保留的/为您的数组分配..如果有一段时间后某些其他应用程序访问此内存并写入它。您将丢失\0
,导致正在读取字符串helloI accessed this space
。这就是你得到的。