2012-11-03 55 views
0

我想動態分配結構數組並對它們執行操作,但我一直運行到分段錯誤。有人能幫助我嗎?什麼導致c代碼段錯誤,功能動態分配

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

void *malloc(size_t size); 

typedef struct { 
    double x; 
    double y; 
} coords; 

struct figure { 
    char fig_name[128]; 
    int coordcount, size_tracker; 
    coords *pointer; 
} fig; 

void init_fig(int n, struct figure **point) 
{ 
    printf("%u\n", sizeof(coords)); 
    point[n]->pointer = malloc(sizeof(coords) * 20); <-------SEGFAULT 
    if (point[n]->pointer == NULL){ 
    exit(-1); 
    } 
    point[n]->pointer[19].x = 2; 
    point[n]->pointer[0].x = 1; 
    point[n]->pointer[0].y = 2; 
    point[n]->pointer[7].x = 100; 
} 

int main() 
{ 
    int numfigs = 1; 
    struct figure * point; 
    point = malloc(sizeof(struct figure) * 16); 
    point = &fig; 
    point[1].coordcount = 1; 
    init_fig(numfigs, &point); 
    return 0; 
} 

我標記了第一個seg故障發生的地方(使用ddd)。我沒有得到的是,我可以在主要操作點[1],但不能在任何其他功能。

+0

這不是我的項目它只是一個簡短的測試文件,我一直使用,試圖找出爲什麼IM葛亭賽格故障 – wenincode

回答

1

我同意@Maxim Skurydin。儘管如此,我想在一些細節上解釋你的錯誤。

讀你init_fig一個假定您通過struct figure **point參數 - 實際上是數組的指針struct figure。這個函數訪問其第n個元素。

但是,在您的main中,您可以做其他事情。你分配一個陣列struct figure,你的point變量指向它的頭部。然後你拿這個本地變量的地址,並打電話給你的init_fig

這是問題所在。 init_fig假設您將它傳遞給一個指針數組,而實際上,這個「數組」僅包含一個元素:在main中聲明的本地point變量。

編輯:

如何正確地做到這一點。

  1. 請假main完好無損,修復init_fig

這意味着,實際上有的figure結構的陣列。意思 - 一個單一的內存塊,解釋爲一系列隨後的結構。

void init_fig(int n, struct figure *point) 
{ 
    printf("%u\n", sizeof(coords)); 
    point[n].pointer = malloc(sizeof(coords) * 20); <-------SEGFAULT 
    if (point[n].pointer == NULL){ 
    exit(-1); 
    } 
    point[n].pointer[19].x = 2; 
    point[n].pointer[0].x = 1; 
    point[n].pointer[0].y = 2; 
    point[n].pointer[7].x = 100; 
} 
  1. 離開init_fig完好。修復main

這意味着我們實際上應該分配指針數組,每一個這樣的一個指針應指向所分配的point結構。

int main() 
{ 
    int numfigs = 1; 
    struct figure ** point; 
    point = malloc(sizeof(struct figure*) * 16); 

    for (i = 0; i < 16; i++) 
    point[i] = malloc(sizeof(struct figure)); 

    point[1].coordcount = 1; 
    init_fig(numfigs, &point); 
    return 0; 
} 
+0

嗯..你介意我問我如何正確地做到這一點呢?我的函數應該採用struct figure *點嗎?或者我應該初始化一個結構圖**點在主。對不起,這個有點新鮮。 – wenincode

+0

好吧,我沒有選擇1,但現在我可以分配的東西指向[n] .pointer [233]遠遠超出分配20.爲什麼這個工作?我應該有seg故障嗎? point [n] .pointer [233] .x = 2; printf(「%lf \ n」,point [n] .pointer [233] .x); – wenincode

+0

@ user1787262在分配的內存之外寫入或讀取是未定義的行爲。如果你非常幸運,它會立即崩潰,如果你不那麼幸運,它會破壞重要數據並在以後崩潰。只是不要這樣做。 –

0

您分配內存並將指針存儲在point中,但當您將&fig指定給它時,則會忘記該指針。

point = malloc(sizeof(struct figure) * 16); 
point = &fig; 

所以,你基本上試圖寫fig[1],這是沒有意義的。

0
struct figure * point; 
    point = malloc(sizeof(struct figure) * 16); 

這裏點是指針指向16層結構的內存堆 但在接下來的行,你已經這樣做了

point = &fig; 

所以它的內存泄漏,也點不指向該分配區域再

init_fig應該是這樣的

void init_fig(int n, struct figure **point) 

這是段錯誤的問題

0

消除這一行點= &fig;

和修改或功能:

void init_fig(int n, struct figure *point) 
{ 
    ... 
    point[n].pointer = (coords*) malloc(sizeof(coords) * 20); 
    ... 
} 

由於你應該通過結構的數組(如你已經創造),而不是一個指針

的陣列

此外,我建議你添加第三個參數到你的init_fig函數,傳遞你想創建的點數組的大小。像:

void init_fig(int n, struct figure *point, int size) 
    { 
     ... 
     point[n].pointer = (coords*) malloc(sizeof(coords) * size); 
     ... 
    } 

因此,使功能更可重用。

和修改調用也:

init_fig(numfigs, &point); to init_fig(numfigs, point); 
+0

我這樣做了,我得到了一個錯誤tester.c:18:6:注意:期望的'結構圖*'但參數的類型'結構圖**' – wenincode

+0

這可能是因爲我測試結構圖*點; (主要),你正在使用結構圖**點。不過,我很高興你已經解決了你的問題:) – dreamcrash

相關問題