Как распечатать элементы структур, содержащихся в массиве - PullRequest
0 голосов
/ 19 января 2019

Я создал массив структур как глобальную переменную.Я инициализировал массив в функции, и я мог распечатать элементы структуры оттуда.Моя проблема в том, что я не могу распечатать значения массива в другой функции (main () в моем случае), кроме той, которую я использовал для инициализации массива.Пожалуйста, как я могу распечатать эти значения?Спасибо.

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

/*
 * 
 */
typedef struct s{
    char *value;
} S;

S list[2];

void function( ){
    char val1[] = "val1";
    char val2[] = "val2";
    S v1 = {val1};
    S v2 = {val2};
    list[0] = v1;
    list[1] = v2;
    printf("%s\n", list[1].value); //prints val2
}
int main(int argc, char** argv) {
    function();
    printf("%s", list[1].value); //prints nonsense 
    return 0;
}

Что я пробовал:

  1. Я изменил функцию (), чтобы взять список в качестве аргумента (функция (список)), и объявил список в main ()вместо.Это не сработало.

  2. Я изменил функцию, чтобы она возвращала список (S * function ()), она не работала.

  3. Я использовал массив целых чисел (вместо структуры, то есть int list [2], объявил ее как глобальную переменную и инициализировал ее в функции ()), и все работало нормально, предполагая, чтопроблема в том, как я получаю доступ к структуре, но я просто не могу понять это.

  4. Я искал в интернете, но не смог получить подобную проблему.

1 Ответ

0 голосов
/ 19 января 2019

В вашей функции function вы присваиваете адрес локальной переменной вашей структуре.После возврата с function этот адрес больше не действителен.Вы можете либо сделать его static, либо распределить его динамически.

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

typedef struct s
{
    char *value;
} S;

S list[2];

void function( )
{
    char val1[] = "val1";
    char val2[] = "val2";
    //Note that you are creating a copy of "val1" here which can be avoided by changing it to char *val1 = "val1";

    list[0].value = malloc(strlen(val1)+1); //allocate space for val1 + NUL-terminator
    strcpy(list[0].value, val1); //copy string
    list[1].value = malloc(strlen(val2)+1);
    strcpy(list[1].value, val2);

    //You could also use the function strdup which allocates memory and duplicates the string
    //list[0].value = strdup(val1);

    printf("%s\n", list[1].value); //prints val2
}

int main(int argc, char** argv)
{
    function();
    printf("%s", list[1].value);

    free(list[0].value); //Don't forget to free.
    free(list[1].value);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...