【问题标题】:How to dynamically allocate memory in an array of strings for some new string and copy that string into the dynamically allocated space in C?如何在字符串数组中为一些新字符串动态分配内存并将该字符串复制到C中动态分配的空间中?
【发布时间】:2015-09-06 17:00:24
【问题描述】:

这是我的代码:

void InsertStringAt(char *array[], char *s, int pos)
{
    if (pos<array.size())
    {
        *array[pos]=(s *)malloc(sizeof(s));
        strcopy(*array[pos], *s);
    }
    else printf("Position exceeds dimensions of array.");
}

这个函数的目的是将字符串s插入array[]的位置pos。这段代码能做到吗?

【问题讨论】:

  • 一些注意事项:C 没有“方法”或成员函数/属性/属性。当您对指针执行sizeof 时,您会得到指针的大小而不是指针指向的内容,请使用strlen 来获取字符串的长度。一旦将数组传递给函数,它就会衰减为指针,并且您无法获得数组的大小。如果你有一个指针,并使用解引用运算符(例如*s),那么你会得到指针指向的第一件事,在你的情况下是一个char。最后,没有strcopy 函数,也许你的意思是strcpy
  • 哦,我差点忘了,在 C 语言中 you should not cast the return of malloc(或任何返回 void * 的函数)。
  • 如果您只尝试编译代码(启用额外警告),我在第一个问题中告诉您的很多内容都是显而易见的。错误和警告消息应该非常简单。
  • 所以说 *array[pos]=malloc(sizeof(s));

标签: c arrays string memory


【解决方案1】:

不,这样不行:

首先你将 malloc 的结果转换为 (s *) 但 s 不是一个类型(它是一个变量)。然后你分配s大小的空间,但s是一个指针,所以你只为指针分配空间。

然后array 被声明为一个指向字符的指针数组。现在您在访问成员时不再需要取消引用数组。编译器会这样做,如果你这样做,那么就会有一个取消引用太多。

做:

array[pos]= malloc(strlen(s)+1);

最后,在 C 中没有类,所以 array.size 是无效的。您必须将数组大小作为单独的变量传递。

我可以建议你返回一个 int 来表示一切都成功了吗?例如。没有内存不足和 pos

【讨论】:

    【解决方案2】:

    sizeof 指针只会给您 8 或 4(取决于您的字长)。因此,要获取字符串的长度,请使用来自&lt;string.h&gt;strlen()。此外,您不需要从 malloc 转换返回值。所以你会得到:

    array[pos] = malloc(strlen(s)+1);
    

    请注意,取消引用已被删除,因为它已经被取消引用。

    另外,函数是strcpy() 而不是strcopy()strcpy()&lt;string.h&gt; 中声明。但是strcpy()可能会导致缓冲区溢出,考虑自己制作:

    int safecpy(char *s, const char *t, size_t siz)
    {
        size_t i;
    
        for (i = 1; (*s = *t) && i < siz; ++i, s++, t++)
            ;
        s[i] = 0;       /* null terminate the string */
    
        return i;
    }
    

    C 数组不知道自己的大小;所以将它作为一个单独的参数传递。建议大小用size_t 表示,而不是int

    最后,将错误消息打印到stderr,这样它们就不会被传送到另一个程序或重定向到文件中:

    else fprintf(stderr, "Position exceeds dimensions of array.");
    

    【讨论】:

    • strcpy 不会导致缓冲区溢出,因为内存是由malloc(strlen(s)+1) 分配的。 (不要让它变得比必要的更困难。)
    猜你喜欢
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2018-06-16
    • 2015-07-14
    相关资源
    最近更新 更多