我正在尝试将一个指向字符串的数组传递给我需要设置值的函数。在传递函数中,我不知道我将获得的字符串数量,被调用的函数正在调用一些返回字符串列表的其他函数。
以下示例代码:
int main() {
char** list;
create(list);
}
int create(char **array) {
char* str[] = { "hello", "dear" };
int len;
int i = 0;
for (i = 0; i < 2; i++) {
len = strlen(str[i]);
printf("%d\n", len);
*(array + i) = (char*) malloc(len * sizeof(char*));
strcpy(*(array + i), str[i]);
i++;
}
return 1;
}
这给了我分段错误。
我在这里做错了什么。请帮忙。
由于
修改 更新了以下评论的代码:
int main() {
char** list;
create(list);
int i = 0;
for (i = 0; i < 2; i++) {
printf("%s\n", list[i]); // segmentation fault
}
}
int create(char **array) {
char* str[] = { "hello", "dear" };
int len;
int i = 0;
array = malloc(2 * sizeof(char*));
for (i = 0; i < 2; i++) {
len = strlen(str[i]);
printf("%d\n", len);
*(array + i) = (char*) malloc(len * sizeof(char));
strcpy(*(array + i), str[i]);
printf("%s\n", array[i]); // this prints
}
return 1;
}
现在在打印列表时在main中出现分段错误。
我正在阅读字符串的实际代码
int i;
for ( i=0; i<reply->elements; i++ )
{
printf( "Result: %d---%s\n", i,reply->element[i]->str );
*array[i] = (char*)malloc(strlen(reply->element[i]->str));
printf("***");
strcpy(array[i],reply->element[i]->str);
printf( "Array[%d]: %s\n", i,array[i] );
}
答案 0 :(得分:1)
您需要为list
分配一些空间或发生未定义的行为:
char* list[2];
您递增i
两次;因此,请从i++
循环底部删除for
。
小调:
const char*
array[i]
代替*(array + i)
malloc
malloc
在您分配len
char*
时分配的空间过多,即使您只需要char
s。另外,正如@CoolGuy所指出的,空字节需要一个额外的字节。用
array[i] = malloc(len * sizeof(char) + sizeof(char));
或
array[i] = malloc(len + 1);
在free
malloc
您将0
两次分配给i
;删除初始化
答案 1 :(得分:1)
您正确地为各个字符串分配内存,但无法为数组本身分配一些内存。
您应该使用:
int main() {
char* list[8] = {0}; /* initialize pointers to NULL */
create(list);
/* free allocated memory - free(NULL) is legal and is a noop */
for (i=0; i<sizeof(list)/sizeof(list[0]); i++) free(list[i]);
return 0; /* never return random value from main */
}
你应该在函数create中删除循环结束时的i++
,因为它会导致双倍增量。
或者,您可以在函数create
中分配数组本身:
int create(char ***array) {
char* str[] = { "hello", "dear" };
int len;
int i = 0;
*array = malloc(1 + sizeof(str)/sizeof(str[0]));
for (i = 0; i < 2; i++) {
len = strlen(str[i]) + 1;
printf("%d\n", len);
(*array)[i] = malloc(len * sizeof(char*));
strcpy((*array)[i], str[i]);
}
(*array)[i] = NULL;
return i;
}
int main() {
char** list;
create(&list);
}
在上面的代码中,数组的长度是create
的返回值,list的最后一个元素是NULL(与argc / argv的逻辑相同)。
答案 2 :(得分:0)
你分配了两个数组(char*
)来存储字符串&#34;你好&#34;和#34;亲爱的&#34;但不分配包含这两个字符串数组的数组(char**
)。
答案 3 :(得分:0)
我建议你将函数create
的声明更改为 -
int create(char ***array);
并称之为 -
create(&list);
在函数create
中分配这样的内存 -
*array = malloc(2 * sizeof(char*));
for (i = 0; i < 2; i++)
{
len = strlen(str[i]);
printf("%d\n", len);
(*array)[i] =malloc(len * sizeof(char*)+1);
strcpy((*array)[i], str[i]);
}
像在main
中那样进行打印。
注意 - 您分配的free
内存。
您应该将len
声明为类型size_t
- &gt; size_t len;
并使用%zu
中的printf
说明符进行打印。
请在此处查看工作代码 - https://ideone.com/GX2k9T