我在理解如何将内存分配给sir[i]
时遇到一些麻烦。根据我的理解(char*)malloc(sizeof(char))
应该只为一个字符分配空间,但是当我运行代码时,它可以读取任何单词,无论长度如何。有人可以解释如何/为什么会发生这种情况?
void read(char **sir,int **ln,int n)
{
int i;
for(i=0;i<n;i++)
{
printf("Read word %d: ",i+1);
sir[i]=(char*)malloc(sizeof(char));
fflush(stdin);
scanf("%s",sir[i]);
ln[i]=(int*)malloc(sizeof(int));
*(ln[i])=strlen(sir[i]);
}
}
答案 0 :(得分:3)
你写的超出你分配的内存的边界。这是未定义的行为,你运气不好,似乎&#34;工作&#34;。
答案 1 :(得分:1)
它被称为缓冲区溢出,导致未定义的行为。它可能会或可能不会使您的问题崩溃,但它仍然是一个安全漏洞。
scanf
%s
没有指定最大长度始终是一个安全漏洞,就像gets()
一样,不应该使用!
BTW:sizeof char
保证为1
,因此您无需指定它 - 只需使用您需要的字符数;乘以sizeof char
可能会被编译器优化掉。
答案 2 :(得分:0)
据我所知(char *)malloc(sizeof(char))应该只 为一个角色分配空间
多数民众赞成。在这种情况下,malloc
返回指向已分配内存的1个字节的指针。
fflush(stdin);
未定义。在这一点上,任何事情都可能发生。
scanf("%s",sir[i]);
也未定义。同样,在这一点上,任何事情都可能发生,从使用段错误将程序崩溃到看起来有效。