【问题标题】:Scanning the Array of pointers issue扫描指针数组问题
【发布时间】:2015-04-21 17:10:10
【问题描述】:
#include<stdio.h>
#define SIZE 3
int main() 
{
char *arr[5];
for(i = 0; i < 5; i++) {
arr[i] = (char *)malloc(SIZE * sizeof(char));
scanf("%s",arr[i]);
}
for(i = 0; i < 5; i++) {
printf("%s",arr[i]);
}
return 0;
}

在上面的代码中,我正在扫描超过 3(大小)个字符,但它工作正常。有什么问题?

【问题讨论】:

  • 你使用的是linux?
  • 未定义的行为。它包括看似明智的行为。
  • @Karthikeyan.R.S 是的,我正在使用 linux
  • @RSahu 你能解释一下吗
  • 当您调用malloc(3) 时,您可能会得到malloc(16) 的等价物,因为标准库实现不希望将内存分成这么小的块。但另一种实现可能只给你3 字节。在第一种情况下,您最多可以阅读 15 个字符,而在第二种情况下,您不会。

标签: c arrays pointers malloc


【解决方案1】:

这是未定义的行为。在 linux 中,并不严格遵循数组越界。如果有空闲内存,它将允许您访问该内存。参考这个link.

在windows中,它会严格按照数组越界。在 linux 中,我们确保不会访问内存不足。

【讨论】:

    【解决方案2】:

    是的,它有效,但它不安全。当你做scanf("%s",arr[i]);时,arr[i]只是RAM中的一个地址,读取的字符将从arr[i]指定的地址开始顺序存储到地址中。

    假设您在执行 malloc 时有 100 个字符的内存,您可能会得到地址 10、20、30、40 和 50。即使您在每个起始地址中读取 5 个字符,它也可以工作。但是,如果 malloac 返回指向 10、13、16、19 和 22 的地址指针。当您使用 5 个字符执行 scanf("%s",arr[0]); 时说“abcde”,字符串将存储在 10 到 15 的位置(一个用于 \0)。当您使用输入“fghij”执行scanf("%s",arr[1]); 时,它将从位置 13 开始写入。现在,如果您在 arr[0] 上执行 printf,您将获得 abcfghij。

    此行为取决于编译器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 2015-01-08
      • 2019-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多