2013-10-20 41 views
3

我對C語言內存概念並不是非常有經驗。我試圖尋找解決方案,但找不到一個解決方案。一個小但很奇怪的<Segmentation Fault>

我只是想在C中創建動態數組。我試圖用這種方式創建它,同時試圖檢查地址是否連續。該程序運行良好。

但是,我在語句system("pause")之後得到了分段錯誤。我也嘗試使用調試器進行調試,但沒有運氣!我正在使用Dev CPP。

任何人都可以引導我嗎?

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

main() 
{ 
int a[0], *ptr, i; 

printf("%d", sizeof(a[0])); 
a[0]=1; 
for(i=1;i<10;i++) 
{ 
    ptr=(int *) malloc(sizeof(int)); 
    printf("Enter a[%d]: ", i); 
    a[i]= *ptr; 
    scanf("%d", &a[i]); 

} 
i=0; 
while(i<10) 
{printf("\n%u", &a[i++]);} 
free(ptr); 
system("pause"); 
} 

回答

1
int a[0], ...; 
... 
a[0]=1; 

你正在編寫出界。這是未定義的行爲。

+0

只有GCC首先允許'int a [0];',並且只有當你不使它成爲'-pedantic'時。 C標準根本不允許0作爲數組維度。 –

3

int a[0]

沒有分配給它(其寬度0)

任何空間,然而,你寫它在這條線:

a[0]=1;

也認爲它具有這裏有10個元素:

while(i<10) 
{printf("\n%u", &a[i++]);} 
free(ptr); 

實際上,由於這只是堆棧內存,所以您只需寫入另一塊堆棧。例如,您可以覆蓋ptr的值。通常這個問題可能在堆棧被解開並且其中的一部分顯然被破壞之前不會被發現。這裏的籌碼在system("pause")之後立即展開,當時主要收益。

(另外,如果ptr是由您寫改寫爲a你不能確保free做任何事情合理的。)

要分配一個10整數數組,使用語法:

int a[10]; 

然後您可以使用[0]到[9]。但是,當你嘗試讀/寫[10]時,這是C不指望任何東西來保護你。

+1

只有GCC允許'int a [0];',並且只有當你不使其成爲'-pedantic'時。 C標準根本不允許0作爲數組維度。 –

0

那麼,你的交易與a是史詩:

int a[0]; // no-items array 
... 

a[0]=1; // WHAT? 
for(i=1;i<10;i++) 
{ 
    ptr=(int *) malloc(sizeof(int)); 
    a[i]= *ptr; // a was int or pointer? And A[9]? 
} 
0

幾個問題:1)你的期待您陣列是10個元素長,但你與0聲明它,並使它的指針數組;

int *a[10]; 

然後

a[i] = (int*)malloc(sizeof(int)); 

並且當釋放;

free(a[i]); 
+0

目前還不清楚'a'應該是一個指針數組(但是沒有明確的理由說明爲什麼有任何分配)。 –

2

代碼中存在很多問題。

  1. int a [0]。您正在定義一個0元素的數組。在C中這不起作用。你不能做一個[0] = 1,因爲只有當a是一個或多個元素的數組時,它纔會起作用。
  2. 它隨着[i] = * ptr變差。這裏有兩個問題,正如上面提到的[1],a [2]等不存在。第二個問題是你分配了ptr,但是分配了可能有一些垃圾的* ptr。

這只是開始。

+0

只有GCC首先允許'int a [0];',只有當你不使它成爲'-pedantic'。 C標準根本不允許0作爲數組維度。 –

1

首先你的a[0]應該是a[10]你試圖使用它的方式。其次,只是malloc的指針,它基本上是一個數組。儘管您不需要在for循環中執行此操作。你可以說ptr = malloc(10 * sizeof(int));,你會很好。不需要施放它。您可以通過數組下標訪問它的元素,如ptr[9]

+0

只有GCC首先允許'int a [0];',並且只有當你沒有使它成爲'-pedantic'。 C標準根本不允許0作爲數組維度。 –