扫描指针数组问题 #包括 #定义尺寸3 int main() { char*arr[5]; 对于(i=0;i

扫描指针数组问题 #包括 #定义尺寸3 int main() { char*arr[5]; 对于(i=0;i,c,arrays,pointers,malloc,C,Arrays,Pointers,Malloc,在上面的代码中,我扫描了超过3个(大小)字符,但工作正常。问题是什么 这是未定义的行为。在linux中,不严格遵循数组的界限。如果有空闲内存,它将允许您访问该内存。参考此 在windows中,它将严格遵循数组的界限。在linux中,我们必须确保不会访问内存不足的服务器。是的,它可以工作,但不安全。当您进行scanf(“%s”,arr[i])时,arr[i]只是RAM中的一个地址读取的字符将按顺序存储到地址中,从arr[i]指出的开始 假设你有100个字符的内存,当你使用malloc时,你可能会得

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

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


在windows中,它将严格遵循数组的界限。在linux中,我们必须确保不会访问内存不足的服务器。

是的,它可以工作,但不安全。当您进行
scanf(“%s”,arr[i])时,arr[i]只是RAM中的一个地址读取的字符将按顺序存储到地址中,从arr[i]指出的开始

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


此行为取决于编译器。

您正在使用linux?未定义的行为。它包括看似明智的行为。@Karthikeyan.R.S是的,我正在使用linux@RSahu请您简单解释一下,当您调用
malloc(3)
时,可能会得到与
malloc(16)
相当的内存,因为标准库实现不希望将内存划分为如此小的块。但是另一个实现可能只给您3个字节。在第一种情况下,您最多可以阅读15个字符,而在第二种情况下,您不会。
#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;
}