如何在字符串数组中为某个新字符串动态分配内存,并将该字符串复制到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来表示一切都成功了吗?例如,没有内存不足和possizeof
指针只会给您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.");