#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个(SIZE)字符,但它工作正常。问题是什么?
答案 0 :(得分:0)
这是未定义的行为。在linux中,没有严格遵循数组的界限。如果有空闲内存,它将允许您访问该内存。请参阅此link.
在Windows中,它将严格遵循数组越界。在linux中,我们确保不会访问内存不足。
答案 1 :(得分:0)
是的它有效,但不安全。当你执行scanf("%s",arr[i]);
时,arr [i]只是RAM中的一个地址。读取的字符将从arr [i]指出的顺序存储到地址中。
让我们说当你使用malloc时你有100个字符的内存你可能会得到地址10,20,30,40和50.即使你在每个起始地址中读取5个字符也可以。但是如果malloac返回指向10,13,16,19和22的指针的情况。当你用5个字符表示'{1}}说'abcde'时,字符串将存储在10到15的位置(一个用于\ 0 )。当您使用输入'fghij'进行scanf("%s",arr[0]);
时,它将从位置13开始写入。现在,如果您在arr [0]上执行printf,您将获得abcfghij。
此行为取决于编译器。