繁体   English   中英

如何在字符串数组中为某个新字符串动态分配内存并将该字符串复制到 C 中动态分配的空间中?

[英]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?

这是我拥有的代码:

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中。 这段代码会实现吗?

不,这不会这样做:

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

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

做:

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

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

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

sizeof一个指针只是给你 8 或 4(取决于你的字大小)。 因此,要获取字符串的长度,请使用<string.h> strlen() 此外,您不需要从 malloc 转换返回值。 所以你会得到:

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

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

此外,该函数是strcpy()而不是strcopy() strcpy()<string.h>声明。 但是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.");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM