需要帮助理解传递char * []到函数

时间:2015-09-16 15:06:26

标签: c pointers segmentation-fault

我正在尝试将一个指向字符串的数组传递给我需要设置值的函数。在传递函数中,我不知道我将获得的字符串数量,被调用的函数正在调用一些返回字符串列表的其他函数。

以下示例代码:

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] );
}

4 个答案:

答案 0 :(得分:1)

  1. 您需要为list分配一些空间或发生未定义的行为:

    char* list[2];
    
  2. 您递增i两次;因此,请从i++循环底部删除for

  3. 小调:

    • 将字符串文字称为const char*
    • 使用array[i]代替*(array + i)
    • don't cast the result of 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