(char *)malloc(sizeof(char))分配多个char?

时间:2016-01-20 09:16:01

标签: c

我在理解如何将内存分配给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]);
    }
}

3 个答案:

答案 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]);

也未定义。同样,在这一点上,任何事情都可能发生,从使用段错误将程序崩溃到看起来有效。