C- malloc,sizeof和strlen函数可能的冲突


#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
typedef struct _person
{
    char *fname;
    char *lname;
    bool isavailable;
}Person;

Person *getPersonInstance(void)
{
    Person *newPerson = (Person*) malloc(sizeof(Person));
    if(newPerson == NULL)
        return NULL;
    return newPerson;
}
void initializePerson(Person *person, char *fname, char *lname, bool isavailable)
{
    person->fname = (char*) malloc(strlen(fname)+1);
  /*problematic behaviour if i write: person->fname = (char*) malloc (sizeof(strlen(fname)+1)); */
    person->lname = (char*) malloc(strlen(lname)+1);
 /*problematic behaviour if i write: person->lname = (char*) malloc (sizeof(strlen(lname)+1)); */
    strcpy(person->fname,fname);
    strcpy(person->lname,lname);
    person->isavailable = isavailable;
    return;
}
// test code sample
int main(void)
{
    Person *p1 =getPersonInstance();
    if(p1 != NULL)
        initializePerson(p1, "Bronze", "Medal", 1);
    Person *p2 =getPersonInstance();
    if(p2 != NULL)
        initializePerson(p2, "Silver", "Medalion", 1);
    Person *p3 =getPersonInstance();
    if(p3 != NULL)
        initializePerson(p3, "Golden", "Section", 1);
    printf("item1=> %10s, %10s, %4un",p1->fname, p1->lname, p1->isavailable);
    printf("item2=> %10s, %10s, %4un",p2->fname, p2->lname, p2->isavailable);
    printf("item3=> %10s, %10s, %4un",p3->fname, p3->lname, p3->isavailable);
    return 0;
}

Initializeperson((内部((如果我使用:

person->fname = (char*) malloc (sizeof(strlen(fname)+1));
person->lname = (char*) malloc (sizeof(strlen(lname)+1));

当启用这两个代码而不是上面的源代码中使用的代码时,我可能会在使用CodeBlocks IDE测试代码时会遇到运行时间错误。控制台很可能会冻结并停止工作。如果我使用Ubuntu终端测试代码,它可以每天工作,无论输入数据的大小如何,都没有问题。

问题:(现在,假设我们正在使用上一段中的2件代码(我知道尺寸计数字节,strlen计数字符的数量,直到找到null ...但是使用时sizeof and strlen时它们在Malloc((内部是否在后台引起冲突?似乎有什么问题?为什么代码具有如此不稳定的不可靠行为?为什么?

sizeof(strlen(fname)+1)没有任何意义。它给出了strlen结果类型的大小,该类型是4个字节的整数。因此,您最终分配了太少的内存。

使用此:

person->fname = malloc(strlen(fname)+1);

sizeof评估其参数的存储大小(这可能是类型的表达式,或者只是类型本身(。因此,仔细观察这里的论点是什么:

strlen(fname)+1

这是size_t类型的表达式。sizeof将为您提供存储size_t(可能是4或8(所需的任何字节。

您的想要足以容纳您的字符串,因此仅strlen()的版本是正确的。在另一种情况下,您仅保留4或8个字节,然后写入您未分配的内存位置 -> 不确定的行为


在旁注:在C中不需要铸造void *,并且被许多(但不是全部(C编码器视为不良练习。请参阅此经典问题。

相关内容

  • 没有找到相关文章

最新更新