2015-04-22 47 views
0

我正在編寫一個小程序,以幫助我更好地理解指針,以完成正在處理的任務。如何使用指針交換項目

這裏的主要

#include <stdio.h> 

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

typedef struct some_t { 
    int x; 
} some_t; 

some_t *i, *j; 

i->x = 1; 
j->x = 2; 

some_t *tmp; 

tmp = i; 
*i = *j; 
*j = *tmp; 

printf("i is %d\n", i->x); 
printf("j is %d\n", j->x); 

return 0; 
} 

當我運行它,我得到一個分割故障和我的emacs GUD-GDB不會通過程序運行。我開始,但接着說'繼續下一次休息。'我最終試圖做的是我有一個bag指針對象(武器,工具等)和一個equipment結構(配備的對象)。當我想裝備bag中的一個對象時,我只想翻轉對象的指針。因此,equipment struct中的指針指向武器,然後bag中的指針交換指向前一個對象替換的內容。

+0

首先使用malloc()分配內存以您的指針,然後分配一個value.Your指針指向一些無效的位置。 – GingerJack

回答

1

some_t *i, *j定義了兩個指針,但它們沒有指向任何有用的地方。它們是未初始化的變量

緊隨這些定義之後,您嘗試取消引用這些指針。既然他們沒有指出任何有意義的東西,那就是你的問題。確保你在東西指向你的指針在使用之前:

some_t a, b; 
some_t *i, *j; 
i = &a; 
j = &b; 

或者類似的規定。

編者提示:你的交換例程中有一堆額外的*;你只是想交換指針,對吧?

tmp = i; 
i = j; 
j = tmp; 
+0

好的做法是在聲明中正確指定指針,或將其設置爲NULL,這樣解除引用就會快速而乾淨地失敗。 – seand

+1

取消引用'NULL'不會引發任何比取消引用未初始化指針更好定義的行爲。關於在定義時間初始化的好處。 –

+0

你不想在生產代碼中依賴這個,但是在典型的機器上,取消引用NULL意味着0應該總是無效的內存,導致立即發生段錯誤。但是,如果指針恰好指向「有效」的內存,則可能不會立即發現問題。 – seand

0

您沒有爲要指向的指針分配內存。沒有這個程序不知道我和j指向的指針。 您需要先分配內存,然後讓i和J指向它。

i=malloc(sizeof(some_t)); j=malloc(sizeof(some_t));

另外你實際上並沒有交換pointers.You被解引用它們基本上從用j指向我指了指存儲位置存儲位置複製數據。這沒關係,但是當你在下一步中做*j = *i時,你基本上是將相同的內容複製到j所指向的內存中。

+0

如果你在路上改變變量類型,我通常會推薦'i = malloc(sizeof * i)'來節省一些麻煩。 –

+0

@CarlNorum我同意 – sumithdev

+0

哦,我完全忘了爲這兩個指針分配內存。談談你的第二點。我看到j如何獲得自己的位置,那麼我該如何正確地做到這一點?交換兩個指針指向的內容。 – rangeme

0

你不能做到以下幾點:

typedef struct some_t { 
    int x; 
} some_t; 

some_t *i, *j; 

i->x = 1; 
j->x = 2; 

在這裏,你有指針ij不指向任何有效的內存。 您需要分配足夠的內存,然後將指針指向已分配的內存,然後才能存儲值。

typedef struct some_t { 
    int x; 
} some_t; 

some_t *i, *j; 
i = malloc(sizeof(*i)); 
j = malloc(sizeof(*j)); 

i->x = 1; 
j->x = 2; 
0

您不需要動態分配空間,但您確實需要分配空間。這是一個靜態分配空間的例子。它也有在那裏你交換,而不是交換解除引用的指針指針(i和j)的變化(我和 j)的:

#include <stdio.h> 

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

typedef struct some_t { 
    int x; 
} some_t; 

some_t val1; 
some_t val2; 
some_t *i, *j; 

i = &val1; 
j = &val2; 

i->x = 1; 
j->x = 2; 

some_t *tmp; 

tmp = i; 
i = j; 
j = tmp; 

printf("i is %d\n", i->x); 
printf("j is %d\n", j->x); 

return 0; 
}