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