2016-05-05 79 views
1

我想定義固定長度串的結構,如下所示:typedef固定長度數組 - >自動擴展大小?

typedef char str8[8]; 

所以我可以創建固定長度字符串的陣列等:

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

我使用MYDATA爲存儲名單: 彼得 Waseels 脾氣暴躁 Lexiunos 貝塔 ...

一切正常,直到mydata [3],它變成LexiunosBeta而不是Lexiunos。然而,mydata [4]仍然只是測試版。

這似乎只發生在size(name)> = size(str8)時。我將str8作爲臨時解決方案擴展到str10,但我真的想知道真正的問題是什麼以及我如何解決它。

如果我將typedef char str8 [8]更改爲更強大的定義,如: typedef {char * x;} str8;它會解決問題嗎?

非常感謝大家!

+0

超出範圍的陣列將調用*未定義行爲*的訪問。 – MikeCAT

回答

3

Lexiunos是9字節計數結尾NUL和您的typedef是char[8],您正在寫入數組的邊界之外。

看看到this thread

在這種特殊情況下,你宣佈一個基於堆棧的數組。根據具體的實現,訪問數組的邊界之外的訪問將簡單地訪問已分配的堆棧空間的另一部分(大多數OS和線程爲堆棧保留存儲器的特定部分 )。

有沒有像堆棧「自動擴展大小」,使用動態內存:

#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

不客氣;) –