【问题标题】:is this code correct?If yes then malloc is already assigning the addresses to name[i] variable then why strcpy is used?这段代码是否正确?如果是,那么 malloc 已经将地址分配给 name[i] 变量,那么为什么要使用 strcpy?
【发布时间】:2015-07-15 09:45:47
【问题描述】:

下面是一段代码

 char str[20];
 char *name[5];
 for(i=0;i<5;i++){
     printf("Enter a string");
     gets(str);
     name[i]=(char *)malloc(strlen(str));
     strcpy(name[i],str);
 }

当每个字符串的第 5 行地址(由 str 变量表示)存储在 name[i] 数组中时,为什么这段代码使用 strcpy() 将每个地址复制到 name[i] 中?

【问题讨论】:

  • 你必须 malloc strlen+1 个字节

标签: c string pointers malloc strcpy


【解决方案1】:

这段代码正确吗?

抱歉,不可以。请遵循以下几点。

第 1 点

请do not castmalloc()的返回值和C中的家人。

第 2 点

malloc() 是为指针分配内存。 strcpy() 用于填充分配的内存。如果你比较代码,

  • name[i]=malloc(&lt;size&gt;)); 将size 字节的内存分配给name[i] 指针。但是,内存位置的包含未初始化或垃圾。

  • strcpy(name[i],str); 它将str 的内容复制到name[i]。此后,name[i] 包含与str 相同的字符串。

注意:

也就是说,对于strcpy() 一个字符串str,您需要malloc() 以获得strlen(str) + 1 字节,以便有空间来终止null。否则,您最终会超出分配的内存区域,而这又会调用undefined behaviour。

此外,您应该(恕我直言,必须)考虑使用 fgets() 而不是 gets()。

【讨论】:

  • 感谢您的回答!顺便说一句,我在编程方面还蹒跚学步!
【解决方案2】:

strcpy() 调用复制字符,而不是指针。

此外,您分配不足,因为您没有为终止 '\0' 字符包含空间。因此,您的代码具有未定义的行为。

所以不,这是不正确的(但问题不在于它使用strcpy(),这很好)。

也许我也认为你should not cast the return value of malloc() in C并不奇怪。

最后,你不应该使用gets(),它非常危险。请改用fgets(),当然还有适当的缓冲区大小参数。

【讨论】:

    【解决方案3】:

    当你使用 malloc 时,你会在内存中创建一个与字符串大小相等的空间,但它是一个空白空间,你只有一个地址。 您必须将字符串上的值复制到 name[i] 数组。 打个比方,你有一壶水,你可以再造一个壶,但如果你从一个锅转移到另一个锅,你只会有水。 锅的创建是malloc函数,内容的传递是strcpy。

    char str[6];                       //create a empty space for 6 characters
    
    char *name[1];                     //create a pointer for a location where
                                       //the array will be stored, does not
                                       //allocate any space
    
    str = "abcdef"                     //assign letters to character array
    
    name[1]=(char *)malloc(strlen(str+1));     //name[1] = _ _ _ _ _ _ _
                                               //allocate space char array with
                                               //size equal to str array plus 1
    
    strcpy(name[1],str);                       //name[1] = a b c d e f /0
                                               //copy the letters from one char
                                               //array to the other
    

    字符数组有6个字符加上一个空字符表示数组结束

    【讨论】:

    • 有趣的类比...您可以编辑您的帖子以包含一个小代码示例吗?这有助于进一步强化您的观点。
    【解决方案4】:

    第 5 行仅分配空间。 malloc() 分配的内存有未指定的值。

    【讨论】:

      【解决方案5】:

      TL;DR;

      malloc 分配内存供进程使用。

      strcpy 将所需内容复制到malloced 地址空间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-30
        • 1970-01-01
        • 2016-03-01
        • 2014-09-18
        • 1970-01-01
        • 2021-09-03
        • 1970-01-01
        • 2016-09-01
        相关资源
        最近更新 更多