2016-05-05 2 views
1

Я хочу, чтобы определить структуру строки фиксированной длины, например:массив фиксированной длины typedef -> авторасширенный размер?

typedef char str8[8]; 

так что я могу создать массивы фиксированной строки длиной как:

str8 * mydata; 
mydata = malloc(100 * sizeof(str8)); 

Я использую MyData для хранения список имен: Петр Waseels Сердитый Lexiunos Бета ...

Все работает отлично до mydata [3], который становится LexiunosBeta вместо Lexiunos. mydata [4], однако, все еще является бета-версией.

Это похоже на то, что размер (имя)> = размер (str8). Я расширяю str8 до str10 как временное решение, но я действительно хочу знать, какова реальная проблема и как я могу ее исправить.

Если я изменил typedef char str8 [8] на более надежное определение типа: typedef {char * x;} str8; решает ли проблема?

Спасибо всем очень!

+0

вне диапазона доступа массивов будет вызывать * неопределенное поведение *. – MikeCAT

ответ

3

Lexiunos - 9 байт, подсчитывающий конечный NUL, и ваш typedef равен char[8], вы пишете за пределами массива.

Посмотрите на this thread:

В данном конкретном случае, вы объявляете массив на основе стека. В зависимости от конкретной реализации доступ за пределами границ массива будет просто получить доступ к другой части уже выделенного пространства стека (большинство ОС и потоков резервируют определенную часть памяти для стека).

Там нет ничего, как «авто-расширения размера» для стека, использовать динамическую память:

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

int main(void) 
{ 
    char *arr[] = {"Peter", "Waseels", "Grumpy", "Lexiunos", "Beta", /*...*/}; 
    size_t size = sizeof arr/sizeof arr[0]; 
    char **mydata; 
    size_t i; 

    mydata = malloc(size * sizeof(*mydata)); 
    for (i = 0; i < size; i++) { 
     mydata[i] = malloc(strlen(arr[i]) + 1); 
     if (mydata[i] == NULL) { 
      perror("malloc"); 
      exit(EXIT_FAILURE); 
     } 
     strcpy(mydata[i], arr[i]); 
    } 
    for (i = 0; i < size; i++) { 
     printf("%s\n", mydata[i]); 
     free(mydata[i]); 
    } 
    free(mydata); 
    return 0; 
} 
+0

Огромное вам спасибо за разъяснение! Теперь я увидел свою ошибку! Нужно изучить хорошую привычку кодирования! – CrazyFrog

+0

Добро пожаловать;) –

Смежные вопросы