2016-05-16 19 views
0

這是我的第一篇文章,所以忍受着我。我在退學後回到C寫作一段時間。我試圖將一個整數數組傳遞到一個函數,該函數會將整個數組打印在同一行上(作爲更大努力的一部分)。我的簡單化代碼如下:傳遞一個int指針到一個函數來打印該數組在C中

// main.c 
#include <stdio.h> 

int main(void) { 

    int arr[] = {3,4,5,6,7}; 
    int *ptr = arr; 
    int l = 5; 

    printarr(arr,l); 
    return 0; 
} 

而且

// function printarr 
#include <stdio.h> 

void printarr(char *ptr, int l) { 

    int k = 0; 
    for (k = 0; k < l; ++k) { 
     printf("%d", ptr[k]); 
    } 
} 

編譯和運行的main.c後,輸出我得到的是:

30004 

我覺得我一直在打我的試圖找出一個簡單的問題來抵擋牆壁。當我在main中迭代和打印數組時,我得到了我期望的輸出('34567'),但是當我試圖通過函數來​​完成時,它顯得很難過。我懷疑我濫用指針,但是我不確定。

幫助表示讚賞。

謝謝。

編輯:在看了前兩個評論後,我完全爲自己感到羞愧。謝謝你們。哇,只是哇。

+1

爲什麼'printarr'採用'char *'? – user2357112

+1

'char * ptr' - >'int * ptr'。在使用之前也放置原型。 – BLUEPIXY

+0

我花了多少時間忽略了顯而易見的現象是荒謬的。我的話。謝謝你的新鮮眼睛。 – GGubs

回答

1

你應該爲你傳遞一個int *它的功能更改爲

void printarr(int *ptr, int l) 

。正如@Malife所指出的那樣,您應該使用-Wall啓用編譯器警告,以便您獲得正確的消息。可選用-Werror使所有警告出錯。

charint有不同的尺寸,int要大得多。從輸出中可以看到4倍。當將值看作char時,您正在迭代內存,在該內存中以部分方式分配您的int號碼。

+0

我使用gcc進行編譯,奇怪的是,我沒有收到編譯器錯誤。感謝您充實答案。 – GGubs

+1

你一般不會得到錯誤(除非你有-Werror編譯器選項)。但至少確保添加-Wall編譯器選項。這將爲您節省許多頭痛,因爲您重新獲得了C的認可。 – Malife

0

printarr應當期待一個int數組,而不是字符數組,所以應該是

void printarr(int *ptr, int l) 

在主,INT * PTR = ARR;不使用或不需要。

您probally也希望把要打印出數組的每個值之間的空間或新行:

void printarr(char *ptr, int l) { 

    int k = 0; 
    for (k = 0; k < l; ++k) { 
     printf("%d\n", ptr[k]); 
    } 
} 
+0

非常感謝。 * ptr是來自我從中分出的代碼的痕跡。乾杯! – GGubs

0

我認爲問題是,你通過一個char指針「printarr」。事實上,當你傳遞「ptr」時,你有這樣的情況:00000011 00000000 00000000 00000000 00000100 ....一個字符有8位,一個int 32位,Ram對於字節順序通常是Little Endian。然後你調用一個printf傳遞一個int,並且該字節被擴展爲32位,所以你可以打印:3 0 0 0 4.在主「ptr」中是一個int,所以你打印int,在這種情況下,3 4 5 6 7.您必須在「printarr」中更改char * ptr - > int * ptr

相關問題