在理解将 char* [] 传递给函数方面需要帮助
need help in understanding passing char* [] to function
我正在尝试将指向字符串的指针数组传递给需要设置值的函数。在传递函数中,我不知道我将获得的字符串数量,被调用函数正在调用其他函数,其中 returns 字符串列表。
示例代码如下:
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] );
}
您分配了两个数组 (char*
) 来存储字符串 "hello" 和 "dear",但没有分配包含这两个字符串数组的数组 (char**
)。
您需要为 list
分配一些 space 或发生未定义的行为:
char* list[2];
你递增 i
两次;因此,从 for
循环的底部删除 i++
。
次要注意事项:
- 将字符串文字称为
const char*
- 使用
array[i]
代替*(array + i)
- don't cast the result of
malloc
malloc
在您分配 len
char*
时分配了太多 space,即使您只需要 char
。另外,正如@CoolGuy 指出的那样,空字节需要一个额外的字节。将分配替换为
array[i] = malloc(len * sizeof(char) + sizeof(char));
或
array[i] = malloc(len + 1);
在 malloc
之后调用 free
你将0
赋值给i
两次;去掉初始化
您正确地为各个字符串分配了内存,但未能为数组本身分配一些内存。
你应该使用:
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
中的return值,list的最后一个元素是NULL(与argc/argv的逻辑相同) .
我建议您将函数声明 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
-> size_t len;
并在 printf
.
中使用 %zu
说明符打印它
在此处查看工作代码 -https://ideone.com/GX2k9T
我正在尝试将指向字符串的指针数组传递给需要设置值的函数。在传递函数中,我不知道我将获得的字符串数量,被调用函数正在调用其他函数,其中 returns 字符串列表。
示例代码如下:
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] );
}
您分配了两个数组 (char*
) 来存储字符串 "hello" 和 "dear",但没有分配包含这两个字符串数组的数组 (char**
)。
您需要为
list
分配一些 space 或发生未定义的行为:char* list[2];
你递增
i
两次;因此,从for
循环的底部删除i++
。
次要注意事项:
- 将字符串文字称为
const char*
- 使用
array[i]
代替*(array + i)
- don't cast the result of
malloc
malloc
在您分配len
char*
时分配了太多 space,即使您只需要char
。另外,正如@CoolGuy 指出的那样,空字节需要一个额外的字节。将分配替换为array[i] = malloc(len * sizeof(char) + sizeof(char));
或
array[i] = malloc(len + 1);
在
malloc
之后调用 你将
0
赋值给i
两次;去掉初始化
free
您正确地为各个字符串分配了内存,但未能为数组本身分配一些内存。
你应该使用:
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
中的return值,list的最后一个元素是NULL(与argc/argv的逻辑相同) .
我建议您将函数声明 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
-> size_t len;
并在 printf
.
%zu
说明符打印它
在此处查看工作代码 -https://ideone.com/GX2k9T