2

我的程序中有很多数组都有这个问题,我不明白为什么。我想我错过了阵列理论的一些东西。

“某人”在我的数组末尾添加了某种字符字符,例如 ?^)(&%。例如,如果我有一个长度为 5 且带有“hello”的数组,那么它是满的,有时它会打印 hello?() /&%%. 如果它有 10 个元素并且我只使用 5 个元素,我可以理解它可能会发生,所以其他 5 个元素可能会得到一些随机值,但如果它已满,那么到底从哪里得到这些奇怪的值?

我通过在末尾手动添加字符'\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];
        }
}

谢谢

4

2 回答 2

5

C 中的字符串以值为 0 的字符终止,通常称为字符文字,即'\0'.

大小为 5 的字符数组不能容纳 string hello,因为终止符不适合。期望终止符的函数将被混淆。

要声明一个包含字符串的数组,最好使用的语法是:

char greeting[] = "hello";

这样,您无需指定长度(计算字符数),因为编译器会为您执行此操作。而且您也不需要包含终止符,它是自动添加的,因此上面将在内存中创建它:

          +-+-+-+-+-+--+
greeting: |h|e|l|l|o|\0|
          +-+-+-+-+-+--+

你说你有问题“从另一个更长的数组填充一个数组”,这听起来像一个最常被称为字符串复制的操作。由于字符串只是带有终止符的数组,因此您不能盲目地将较长的字符串复制到较短的字符串上,除非您知道有额外的空间。

鉴于上述情况,此代码将调用未定义的行为:

strcpy(greeting, "hi there!");

因为被复制到greeting数组中的字符串比数组的空间长。

这通常通过使用“已知足够大”的缓冲区来避免,或者添加手动跟踪所用空间的检查。有一个名为strncpy()which sort of do this 的函数,但我不建议使用它,因为它的确切语义相当奇怪。

于 2012-05-09T14:22:21.240 回答
0

您正面临数组边界限制的问题。如果数组的大小为 5 ,那么第六个位置就没有必要\0安全了。因为它不是为您的数组保留/分配的内存。如果一段时间后,其他一些应用程序访问此内存并对其进行写入。您将丢失正在读取\0的字符串的结果。helloI accessed this space这就是你得到的。

于 2012-05-09T17:57:53.473 回答