2011-09-06 77 views
2

初學者在C這裏。這裏合法嗎?我不斷收到身份訪問衝突,當我運行這段代碼:幫助結構和循環在C

struct point { 
    char *x; 
    char *y; 
} 

int main() 
{ 
    .... 
    struct point *pt; 

    for (;;) 
    { 
     ....   
     pt = process_message(message); 
     printf("%s",pt->x); 
     ... 
    } 
} 

struct point* process_message(char* message) 
{ 
    struct point *pt; 
    pt = malloc(1*sizeof(struct point)) 
    strncpy(pt->x, message, 4); 
    return pt; 
} 

編輯

嗨,大家好我做出了一些改變......但仍然得到了訪問衝突。請建議!

+0

顯示'process_message'的代碼。現在,您正在使用未初始化的指針... – delnan

+0

我們需要更多的代碼才能知道錯誤在哪裏。 – wormsparty

+1

'process_message'返回一個指向'struct price'的指針,但變量'pt'是一個指向'struct point'的指針。不要混合那樣的類型。 – pmg

回答

11

您需要爲process_message中的struct point分配內存。

事情是這樣的:

struct point* process_message(char* message) 
{ 
    struct point *pt; 
    pt = malloc(1*sizeof(struct point)); 
    // ... do some processing ... 
    return pt; 
} 

當然,你應該在某些時候free指針之後。

您還應該在process_message中返回struct point或檢查您的類型一致性。如果你仔細看,你會看到你正在返回一個struct price*,但你期待(在主叫方)struct point *

UPDATE

現在這個問題進行了更新,您還需要爲char *x分配內存和char *y如果要做到這一點:

strncpy(pt->x, message, 4); 

我會推薦閱讀關於C++中的內存管理和指針的一點(或很多)。指針並不是處理數據的唯一方式,在編程語言中的數據爲

(做了簡化代碼沒有錯誤檢查)

+2

然後釋放它! – James

+0

請注意,'pt-> x'也是一個指針,它的使用方式也意味着它需要指向某個東西。 –

+0

@Steve:是的,OP只是在問題中加了這個。 –

2

記得在功能process_message

pt = malloc (sizeof (struct point)); 
/* do processing */ 
return pt; 

也已完成了pt工作後,記得要釋放它free (pt)分配內存。

編輯

還需要分配的內存塊中的字符串存儲xy的功能,pt的分配之後。當你完成工作後,你需要首先釋放字符串(內存塊),然後釋放結構。

+0

我更喜歡使用'sizeof * pt'。當'pt'成爲'struct price'的指針時,不需要改變malloc的行:-) – pmg

5

您的main功能正常。你的問題在process_message,你使用的是一個指向結構的指針,但是沒有爲它分配任何內存,訪問它,然後返回它。單獨聲明一個指針不會創建用於存放結構的內存。所以你應該爲結構分配內存(例如使用malloc),以便內存在函數結束後「存在」。然後你可以返回指向它的指針,然後當你完成它的時候,它就會成爲主要的指針。

鑑於您正在進行的簡單操作,可能有更好的方法來完成這個目標。一是要保持一個「從零開始」的結構當地在main功能,並通過其地址來處理消息:

struct point pt; 
process_message(message, &pt); 
printf("%s", pt.x); 

這將「再利用」的本地內存,不需要分配/自由。注意這裏你沒有返回任何東西,你只需在過程函數中「填充」結構。

最後,如果你用C的現代版,可以真正地從函數返回的完整結構,如果你想:

struct point process_message(char* message) 
{ 
    struct point pt; 
    ... do some processing ... 
    return pt; 
} 

,並調用它是這樣的:

struct point pt = process_message(message); 
+0

(+1)我更喜歡你的答案。如果調用很多次,我認爲性能會受到'process_message'內'malloc'調用的傷害。 –

+0

您必須使用真正古老的C版本才能遇到返回結構的問題。在C89標準發佈之前的這段時間允許使用多年(儘管在K&R 1st Edn發佈之後,它不允許)。 –

0

無論何時創建指針,它只是一個sizeof(ptr)內存,它指向一些數據。所以你必須有一些存儲數據的地方。 因此,無論是在你的函數(process_message)或調用函數中分配內存。 它應該像

struct point *pt = (struct point*)malloc(sizeof(struct point)); 
+1

我更喜歡使用'sizeof * pt'(不需要轉換malloc的返回值)。當'pt'變成'struct price'的指針時,將不需要改變malloc行:-) – pmg

0

書面現在,你分配結構點,但結構包含指針爲字符串,而不是字符串本身存儲。您需要爲字符串分配空間複製到他們面前:

pt = malloc(1*sizeof(struct point)); 
pt->x = (char *)malloc(strlen(message) + 1); 

不要忘了做同樣爲PT-> y您使用它之前,不要忘了單獨釋放分配的存儲爲字符串,然後分配給結構。