动态字符串数组:在外部函数中分配

时间:2014-10-19 15:20:07

标签: c arrays string function malloc

我需要你的帮助。

我有一个N个元素的静态数组。我需要插入一个函数,动态分配字符串。

这是我的代码,它有一个问题:

<<警告:从不兼容的指针类型传递'insert'的参数1。    预期'char ***'但参数类型为'char *(*)[N]'>>

感谢您的帮助!

/* MAIN */
int main()
{
    char* array[N];
    int i=0;

    while (...)
    {
        i++;
        insert(&array, i);
    }
    ...
    free(array);
    return 0;
}

/* FUNCTION */
void insert(char*** arrayPTR, int i)
{
    printf("Enter the string: ");
    scanf("%s", string);

    (*arrayPTR)[i]=malloc( strlen(string) * sizeof(char) );

    strcpy(*arrayPTR[i], string);
}

2 个答案:

答案 0 :(得分:2)

你几乎就在那里。你的两个主要问题是:

  1. 在将数组传递给您不需要的函数时,您需要添加额外的间接层,这实际上会给您带来问题。

  2. 虽然您需要free()各个数组元素,但您不需要 - 也不应该 - free()数组本身,因为您没有动态分配它。

  3. 以下是它应该更贴近的内容:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define N 5
    #define MAX_BUFFER 100
    
    void insert(char** arrayPTR, int i);
    
    int main()
    {
        char* array[N];
    
        /*  Populate arrays  */
    
        for ( size_t i = 0; i < N; ++i ) {
            insert(array, i);
        }
    
        /*  Print and free them  */
    
        for ( size_t i = 0; i < N; ++i ) {
            printf("String %zu: %s\n", i + 1, array[i]);
            free(array[i]);
        }
    
        return 0;
    }
    
    void insert(char** arrayPTR, int i)
    {
        /*  Prompt for and get input  */
    
        printf("Enter the string: ");
        fflush(stdout);
        char str[MAX_BUFFER];
        fgets(str, MAX_BUFFER, stdin);
    
        /*  Remove trailing newline, if present  */
    
        const size_t sl = strlen(str);
        if ( str[sl - 1] == '\n' ) {
            str[sl - 1] = 0;
        }
    
        /*  Allocate memory and copy  */
    
        if ( !(arrayPTR[i] = malloc(strlen(str) + 1)) ) {
            perror("couldn't allocate memory");
            exit(EXIT_FAILURE);
        }
        strcpy(arrayPTR[i], str);
    }
    

    带输出:

    paul@thoth:~/src/sandbox$ ./dp
    Enter the string: these
    Enter the string: are
    Enter the string: some
    Enter the string: simple
    Enter the string: words
    String 1: these
    String 2: are
    String 3: some
    String 4: simple
    String 5: words
    paul@thoth:~/src/sandbox$ 
    

答案 1 :(得分:0)

样品

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 10

void insert(char *arrayPTR[N], int index);

int main(void){
    char *array[N] = { NULL };
    int i, n;

    for(i = 0; i<N; ++i){
        insert(array, i);
        if(*array[i] == '\0')
            break;
    }
    n = i;
    for(i=0; i < n; ++i){
        puts(array[i]);
        free(array[i]);
    }
    return 0;
}

void insert(char *arrayPTR[N], int i){
    int ch, count = 0;
    char *string = malloc(1);

    printf("Enter the string: ");
    while(EOF!=(ch=getchar()) && ch != '\n'){
        string = realloc(string, count + 2);//Size expansion
        string[count++] = ch;
    }
    string[count] = '\0';

    arrayPTR[i] = string;
}