Doublepointer with Strings в C / Указатели на массив с malloc - PullRequest
0 голосов
/ 26 октября 2018

Может ли кто-нибудь объяснить мне, почему первый указатель (stringarray [0]) отсутствует в моих выходных данных и как его решить.также я хотел бы знать, как я могу освободить свою память от всех указателей malloc.

int main(int argc, char **argv) {

[...]

char ** stringarray;
if (( stringarray = (char **)malloc(counter*sizeof(char)))== NULL){exit(0);}

int k = 0;
for (i = 0; i < len; i =i+1){
    if((strcmp(countries, districts[i]) == 0) && ( argvIntPeoplelimit <= people[i])) {
        if (( stringarray[k] = (char * ) malloc(100*sizeof(char)))== NULL){exit(0);}

        snprintf(stringarray[k],100,"The Country %s has %d people.",countries[i],people[i]);
        printf("%d %d %s %s %d\n",i,k,stringarray[k], countires[i],people[i] ); //here stringarray[k] k==0 has a value
        k=k+1;
    }  
}
write_file(stringarray,counter);
for (int f = 0; f < k; ++f)
{
    // if i call stringarray[0] nothing shows up


    //ERROR can't free(stringarray);

}
    return 0;
}

Я не знаю, как создать структурные указатели со строками, которые позволяют мне обрабатывать данные поверхв "char * result []" функции write_file.

void write_file(char *result[], int len);

Любая помощь, советы, советы приветствуются!Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Я считаю, что это правильный способ для выделения памяти для массива строк:

// number of pointers/strings; don't have to cast the result of malloc
char** stringArray = malloc(sizeof(char*) * 2);

// allocate however many chars for each pointer
for(i = 0; i < 2; ++i)
    stringArray[i] = malloc(sizeof(char) * 10);

strcpy(stringArray[0], "Hello");
strcpy(stringArray[1], "world!");

printf("%s %s\n", stringArray[0], stringArray[1]);

И для освобождения вышеупомянутого, вы бы сделали это:

for(i = 0; i < 2; ++i)
    free(stringArray[i]);

free(stringArray);
0 голосов
/ 26 октября 2018

Зачем все усложнять? Избегайте выделения памяти, если вы хотите сбросить данные в файл

for (i = 0; i < len; i =i+1){
if((strcmp(countries, districts[i]) == 0) && ( argvIntPeoplelimit <= people[i])) {
    char country_inf[256] = {0};
    int info_len;
    info_len = snprintf(country_inf,sizeof(country_inf),"The Country %s has %d people.",countries[i],people[i]);
    write_file(country_inf,info_len);
}  

}

write_file должен открыть файл в режиме добавления и записать новые данные в файл. Без распределения нет свободного

Тем не менее, если вы хотите использовать. Ваше первое распределение неверно. Это должно быть sizeof (char *)

stringarray = (char **)malloc(counter*sizeof(char*))
...