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

如何在字符串数组中为某个新字符串动态分配内存,并将该字符串复制到C中动态分配的空间中?,c,arrays,string,memory,C,Arrays,String,Memory,以下是我的代码: 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."); } void I

以下是我的代码:

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.");
}
void InsertStringAt(char*array[],char*s,int-pos)
{
如果(pos否,则此操作不起作用:

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

然后,
array
被声明为指向字符的指针数组。现在,当您访问成员时,不再需要对数组进行解引用。编译器将执行此操作,如果执行此操作,则会有一个解引用过多

做:

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


我建议您返回一个int来表示一切都成功了吗?例如,没有内存不足和pos
sizeof
指针只会给您8或4(取决于您的单词大小)。因此要获得字符串的长度,请使用
strlen()
中的
。此外,您不需要从malloc强制转换返回值。因此您将获得:

array[pos] = malloc(strlen(s)+1);
请注意,取消引用已被删除,因为它已取消引用

<函数> <代码> SrcPy](<代码> >不>代码> STARCONE()/<代码> <代码> STRCYPY()/<代码>在<代码> <代码>中声明。但是<代码> STRCYPY()/代码>可能导致缓冲区溢出,请考虑自己制作:

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没有“方法”或成员函数/属性/属性。对指针执行
sizeof
操作时,您得到的是指针的大小,而不是指针指向的内容,请使用
strlen
获取字符串的长度。一旦将数组传递给函数,它将衰减为指针,而无法获得数组的大小。如果有指针,请使用deref引用操作符(例如,
*s
)然后你得到指针指向的第一个东西,在你的例子中是一个
字符
。最后,没有
strcopy
函数,也许你的意思是
strcpy
?哦,我差点忘了,在C语言中(或者任何返回
void*
)。如果您只尝试编译代码(启用了额外的警告),那么我在第一个问题中告诉您的很多内容都是显而易见的。错误和警告消息应该非常简单。所以只需说*array[pos]=malloc(sizeof(s))在这里,
strcpy
不会导致缓冲区溢出,因为内存是由
malloc(strlen+1)
分配的(不要让它变得过于困难)
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;
}
else fprintf(stderr, "Position exceeds dimensions of array.");