2011-05-21 97 views
2

我想寫一個響應到一個變量,我不知道該怎麼做。困惑指針?

這不起作用 - 螺絲內存,但沒有保護的錯誤:

for (int i = 0; i < 20; i++) { 
    list[i] = 'a'; 
} 

同樣的,這一點 - 內存搞砸了:

for (int i = 0; i < 20; i++) { 
    *(((int*)(list))+i) = 'a'; 
} 
//I don't think this is a string issues as this doesn't help: 
//*(((int*)(list))+20) = '\0'; 

這將導致總線錯誤:

for (int i = 0; i < 20; i++) { 
    *list[i] = 'a'; 
} 

這可以根據需要工作:

*list = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 

我在做什麼錯?

P.S.listchar**

+1

'char **'不是一個字節序列,它是一個指向'char'的指針。你有沒有分配任何內存? – 2011-05-21 19:08:02

+0

你爲這個** list **變量分配了內存,對嗎? – 2011-05-21 19:10:38

+0

我如何分配內存,使其像'* list =「aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa」;'做到這一點? – 2011-05-21 19:12:30

回答

2

在C中,指針可以用來表示一個數組,而單個字符串是一個數組char,或換句話說,一個char *。這意味着char **是一個字符串數組。因此,如果您想將字符放入第一個字符串(假設已將內存分配給它),則應在第一個循環中使用list[0][i] = 'a'; - 即將'a'放入0字符串的位置i

另一種解釋char **(我懷疑是你應該使用的那個)的方法是它是一個指針,指向一個指向數組char的指針。在這種情況下,您可以使用「外部」指針來修改內部指針指向的內容;這可用於第一分配字符串,然後寫入到它:

*list = malloc(21); // Allocate 21 bytes and make the pointer that 'list' points to refer to that memory 
for (int i = 0; i < 20; i++) { 
    (*list)[i] = 'a'; 
} 
(*list)[20] = '\0'; // Also, you need the null terminator at the end of the string 

在存儲器中,這是這樣的:

list ---> (another pointer) ---> |a|a|a|a|a|a|...|a|a|\0| 
1

既然你想要一個字節數組,那麼char**是錯誤的 - 這是一個指向char的指針。你想要一個數組char*,但如果它是固定長度,我會聲明它爲char list[20]

好像你想寫的東西是這樣的:

char list[20]; 
for (int i = 0; i < 20; i++) { 
    list[i] = 'a'; 
} 

或者,如果你想堆分配使用

char *list = malloc(20); 

由於我們減少到猜測,我認爲你意思是說*list是一個字節數組。在這種情況下,代碼將如下所示:

char **list = get_list_from_somewhere(); 
*list = malloc(20); 
for (int i = 0; i < 20; i++) { 
    *list[i] = 'a'; 
} 
+0

我不行。列表由MiG(mach ipc)子系統使用。列表是一個地址。我必須給它寫信,所以米格挑選名單併發送。 – 2011-05-21 19:11:48

+1

@Nick如果你告訴我們你的問題是什麼,回答你的問題會容易得多。如你的問題所示,我們必須猜測。沒有生產力。 – 2011-05-21 19:13:38

+0

我不能讓列表在堆棧上。它必須堆積如山。 – 2011-05-21 19:16:55

0

您是如何初始化list的?

char** list; 

不會在這種情況下工作,你就必須有像

char* list[20]; 

或動態分配。

1
char** list 

不是「的字節數組」其一個'指針指向字符的指針',你可以把它看作'字符列表列表'。同樣,如果你這樣定義它,你需要malloc足夠的內存來保存數據。

當你寫:

list[i] = 'a'; 

它搞亂內存,因爲你把一個char 'A' 在指定的位置容納一個指針。實際上,在大多數編譯器中,字符文字都是int類型的,所以實際上存儲一個int形式的'a'作爲指向內存位置的指針,這會導致各種內存損壞。

如果你想「名單」是在棧上,然後把它定義爲:

char list[20] 

如果你想「名單」是在堆中,然後把它定義爲:

char* list; 
list = malloc(sizeof(char) * 20); 

在這兩種情況下訪問它:

list[i] 

而且它不是安全地假定爲int的大小等同於一個指針的大小爲你在第二個例子中已經完成了。至少我認爲那就是你想要做的。

此外,如果你從數據流或類似的東西存儲原始字節,你應該使用'unsigned char'而不是'char',爲了更安全使用'int8_t',因爲你不能總是保證'char '是8位,儘管它在大多數平臺上。