массив символов в строку внутри структуры - PullRequest
2 голосов
/ 23 марта 2012

У меня есть массив из 4 символов, например:

char char_array[10];

char_arr[0] = 'a';
char_arr[1] = 'b';
char_arr[2] = 'c';
char_arr[3] = 'd';
char_arr[4] = '\0';

и у меня есть структура:

typedef struct{
int my_int;
char *my_string;
} my_struct_t;

my_struct_t my_struct;  

my_struct.my_string = malloc(10);

Я хочу присвоить массив символов строке my_struct.my_string Как мне это сделать? Я попробовал следующее:

Попытка: 1

my_struct.my_string = malloc(10) 
my_struct.my_string[0] = char_arr[2];
my_struct.my_string[1] = char_arr[2];
my_struct.my_string[2] = '\0';

Попытка: 2

strcpy(my_struct.my_string, char_arr);

Оба сбоя, т. Е. Место назначения пустое (компиляция выполнена успешно). Почему вышеперечисленное терпит неудачу и как я могу преодолеть это?

У меня есть как структура, так и массив char в стеке, так как я не хочу их, когда выхожу из функции. Я выделил память для my_struct.my_string перед ее назначением.

Ответы [ 4 ]

2 голосов
/ 23 марта 2012

Если char_arr имеет тип char[N], то массив malloc от sizeof(char_arr)/sizeof(char_arr[0]) до my_struct.my_string. А затем скопируйте значение в каждый индекс, используя strcpy. Наконец free когда закончите.

1 голос
/ 24 марта 2012

Вы можете сделать это двумя способами:

Назначить указатель на массив символов

Как только функция выйдет из char_array [10], на который указывает указатель, станет недействительным.Компилятор не выдаст ошибки, но в конечном итоге программа, скорее всего, вылетит, потому что вы перезапишете данные для другой функции или прочитаете неправильные данные, потому что другая функция перезаписала их чем-то другим.Вы должны узнать о , как работает стек в архитектуре вашего компьютера.

    char                  char_array[10];
    my_struct_t           var;

    var.my_string = &array[0];

    var.my_string[3] = 'a';

    if (var.my_string[0] == char_array[0])
        printf("See, changes using the pointer effect char_array.\n");
    else
        printf("This will never happen.\n");

Выделить память и скопировать массив символов

Я использовал для Циклы, чтобы помочь понять, как именно это работает.Как только текущая функция завершит работу, указатель все равно будет указывать на действительную память, если вам удастся как-то ее сохранить.

    char                  char_array[10];
    my_struct_t           var;
    int                   l;

    char_array[0] = 'a';
    char_array[1] = 0;

    // l = strlen(&char_array[0])
    for (l = 0; char_array[l] != 0; ++l);

    var.my_string = (char*)malloc(sizeof(char) * l);

    // strcpy(var.my_string, &char_array[0]);
    for (l = 0; char_array[l] != 0; ++l)
        var.my_string[l] = char_array[l];

    var.my_string[0] = 'a';

    if (var.my_string[0] != char_array[0])
        printf("See, changes using the pointer DO NOT effect char_array.\n");
    else
        printf("This will never happen.\n");
1 голос
/ 23 марта 2012

Полагаю, вы выделяете char_arr в стеке, поэтому 1-й подход дает сбой.2-й подход не работает, если вы не выделите память для места назначения.Вот некоторые из правильных способов:

  1. выделить char_arr в куче и использовать my_struct.my_string = char_arr, или
  2. выделить my_string в куче и использовать strcpy(my_struct.my_string, char_arr)
  3. используйте strdup, если ваш компилятор поддерживает это.

Более подробное объяснение:
Вы должны понимать основы управления памятью на Си.В Си строка - это просто указатель на кусок памяти.Копирование этого указателя не предотвратит исчезновение выделенной в стеке строки.Итак, вы все равно должны выделить память в куче.Чтобы сделать это, вы либо выделяете char_arr там (что делает 1-й метод действительным), либо оставляете char_arr в стеке, но тогда вы не можете сохранить ссылку на его данные (он будет уничтожен послеваша текущая функция завершается), вам нужно скопировать данные в выделенную кучу строку.Это можно сделать вручную (malloc) или strdup.

.
1 голос
/ 23 марта 2012

Вам необходимо выделить память для my_string перед сохранением в ней char_arr.

Если вы выделили память, она должна работать.Это то же самое, что и ваш код (без typedef), и работает нормально:

struct my {int my_int;char * my_string;} p;

int main()
{
char char_arr[5];
strcpy(char_arr, "abcd");
p.my_string = (char*) malloc(5);
strcpy(p.my_string, char_arr);
print_string(); //
return 0;
}

print_string()
{
printf("%s",p.my_string);
}
...