2013-07-03 69 views
0

我想設置一個整數指針數組。程序應該設置索引i處的指針指向一個整數值2 * i。然後程序應該打印出前5個指針元素的pointees,它們應該是0,2,4,6,8。設置一個整數指針數組

出於某種原因,我收到了分段錯誤。有誰能告訴我爲什麼會發生這種情況,我能做些什麼來解決它?

我試圖用「arr [index] =&i;」替換最後一行,它不會給我一個分段錯誤,但仍然給我錯誤的結果。

幫助將不勝感激,剛開始的指針數組。

#include <stdio.h> 

void setArr (int); 

int * arr[10]; // array of 10 int pointers 

int main(int argc, char *argv[]) 
{ 
    int i; 

     setArr(0); 
     setArr(1); 
     setArr(2); 
     setArr(3); 
     setArr(4); 


     for(i=0; i<5;i++) 
      printf("arr [%d] = %d\n", i, *arr[i]); /* should be 0, 2, 4, 6, 8 */ 

    return 0; 
} 

/* set arr[index], which is a pointer, to point to an integer of value 2*index */ 
void setArr (int index){ 
    int i = 2 * index; 
    * arr[index] = i; 
} 
+1

int * arr [10]'只是10個指針,並且不指向任何有效的內存。請分配或使用'int arr [10]'和'arr [index] = i;' – VoidPointer

+1

並且沒有全局變量plox! – 2013-07-03 18:04:50

回答

2

問題是,您沒有爲陣列中每個項目指向的內存分配內存。該生產線

*arr[index] = i; 

將設置一些隨機的內存地址(無論是最初在arr[index])到i值。

你應該做的是:

void setArr(int index) 
{ 
    int *i = malloc(sizeof(int)); // allocate memory for the value 
    *i = 2 * index; // set the value 
    arr[index] = i; // make the array slot point at the value 
} 

,但你需要確保free()內存更高版本。例如,在你的main()功能的return 0;語句之前,就把:

for (i = 0; i < 5; i++) 
    free(arr[i]); 
+0

爲什麼不array [index] =&i;工作? – Sophie

+1

@Sophie'i'的類型是'int *',但'&i'的類型是'int **';它是一個指向int的指針。數組中的值只是指向一個整數值(這就是爲什麼我使用'i'而不是'&i')。 – feralin

+0

謝謝,現在更清楚了。 – Sophie

0

您需要爲數組內的指針指定malloc空間。

+1

「...或者分配...」 – 2013-07-03 18:04:12

+0

呵呵麼?我沒有寫出答案... – 2013-07-03 19:13:29

0

這是從Yashavant P. Kanetkar的讓我們「C」章9-9和應該闡明你爲什麼做了什麼,前面沒工作。

當我們使用二維字符數組時,我們可以自由地初始化我們聲明數組的字符串,或者使用scanf()函數接收字符串。但是,當我們使用指向字符串的指針數組時,我們可以在我們聲明數組的地方初始化字符串,但是我們無法使用scanf()從鍵盤接收字符串。因此,下面的程序永遠不會解決。

main() 
{ 
char *names[6] ; 
int i ; 
for (i = 0 ; i <= 5 ; i++) 
{ 
printf ("\nEnter name ") ; 
scanf ("%s", names[i]) ; 
} 
} 

該程序不起作用,因爲;當我們聲明數組時,它包含垃圾值。將這些垃圾值發送到scanf()作爲應該保持從鍵盤接收字符串的地址是絕對錯誤的。 解決方案 如果我們傾向於使用scanf()從鍵盤接收字符串,然後將它們的地址存儲在一個指向字符串的指針數組中,我們可以按照如下所示的方式稍微進行一些操作。

#include "alloc.h" 
main() 
352 Let Us C 
{ 
char *names[6] ; 
char n[50] ; 
int len, i ; 
char *p ; 
for (i = 0 ; i <= 5 ; i++) 
{ 
printf ("\nEnter name ") ; 
scanf ("%s", n) ; 
len = strlen (n) ; 
p = malloc (len + 1) ; 
strcpy (p, n) ; 
names[i] = p ; 
} 
for (i = 0 ; i <= 5 ; i++) 
printf ("\n%s", names[i]) ; 
} 

這裏我們首先在字符串n []中使用scanf()得到一個名稱。然後我們使用strlen()發現了它的長度並且爲這個名字的副本分配了空間。這種內存分配已經使用稱爲malloc()的標準庫函數完成。該函數需要分配的字節數,並返回它分配的內存塊的基地址。該函數返回的地址始終爲void *類型。因此,它已被轉換爲char *使用稱爲類型轉換的功能。類型轉換在第15章中詳細討論。這個函數的原型已經在文件'alloc.h'中聲明瞭。因此我們有#include這個文件。 但爲什麼我們不使用數組來分配內存?這是因爲在編寫程序的時候,我們必須提交數組的大小。而且,在程序執行期間無法增加或減少數組大小。換句話說,當我們使用數組時,會發生靜態內存分配。與此不同的是,使用malloc(),我們可以在執行過程中動態地分配內存。我們傳遞給malloc()的參數可以是一個變量,其值在執行過程中可以更改。 一旦我們使用malloc()分配了內存,我們已將通過鍵盤接收到的名稱複製到此分配的空間中,最後將分配的塊的地址存儲在name [](指向字符串的指針數組)的相應元素中。 由於我們需要分配內存然後執行復制,所以此解決方案在性能上受到影響。