2014-11-02 22 views
0

我已經創建了一個函數,它執行C中的歐氏除法並將商和餘數作爲函數參數。指針作爲函數參數的問題

代碼1:

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

void euclidean(int a, int b, int * q, int * r); 

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

    int * q; 
    int * r; 

    euclidean(5,4, q, r); 

    printf("q = %d, r = %d", *q, *r); 

    return 0; 
} 

void euclidean(int a, int b, int * q, int * r){ 
    q = (int*)malloc(sizeof(int)); 
    r = (int*)malloc(sizeof(int)); 

    *q = a/b; 
    *r = a % b; 

    //printf("q = %d, r = %d", *q, *r); //this will show 

    return; 
} 

代碼2:

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

void euclidean(int a, int b, int * q, int * r); 

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

    int * q; 
    int * r; 

    euclidean(5,4, q, r); 

    printf("q = %d, r = %d", *q, *r); 

    return 0; 
} 


void euclidean(int a, int b, int * q, int * r) 
{ 
    *q = a/b; 
    *r = a % b; 

    //printf("q = %d, r = %d", *q, *r); //this won't show 

    return; 
} 

兩個版本都無法正常工作。我編譯並在Windows上運行代碼,並且程序在運行時被殺死而不打印任何東西(即「q = 1,r = 4」)。我的猜測是,如果我不得不在Linux上編譯和運行它,終端會給我一個「分段錯誤」錯誤(不確定)。我真的不明白爲什麼它不起作用,尤其是代碼清單1。對於代碼清單2可以爭辯說,由於操作的結果是創建它們的函數內的某種常量變量,因此它們不能保留在函數的末尾(我也需要確認) 。由於

+2

在C和C++函數參數中按值傳遞。 'q'和'r'在'main'中未初始化。 – juanchopanza 2014-11-02 20:46:49

+0

開始添加'免費' – deviantfan 2014-11-02 20:47:46

+0

另外,[不要投出malloc(和朋友)]的結果(http://stackoverflow.com/q/605845)。另外,'void'函數最後確實不需要明確的'return;'。另外,由於C99'main'末尾有一個隱式的'return 0;'。如果你有選擇,考慮在整個呼叫站點之前放置整個功能,而不是前向聲明。如果你不重複自己,錯誤的機會就會減少。 – Deduplicator 2014-11-02 21:02:48

回答

2

保持簡單,愚蠢的(有這樣的原則)。:)

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

void euclidean(int a, int b, int * q, int * r); 

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

    int q; 
    int r; 

    euclidean(5,4, &q, &r); 

    printf("q = %d, r = %d", q, r); 

    return 0; 
} 

void euclidean(int a, int b, int * q, int * r) 
{ 
    *q = a/b; 
    *r = a % b; 
} 

如果你確實想分配的功能內存中,然後該代碼將看起來像

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

void euclidean(int a, int b, int * *q, int * *r); 

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

    int * q; 
    int * r; 

    euclidean(5,4, &q, &r); 

    printf("q = %d, r = %d", *q, *r); 

    free(q); 
    free(r); 

    return 0; 
} 

void euclidean(int a, int b, int * *q, int * *r){ 
    *q = (int*)malloc(sizeof(int)); 
    *r = (int*)malloc(sizeof(int)); 

    **q = a/b; 
    **r = a % b; 
} 
1

你想要的是傳遞引用,它允許被調用者修改調用者提供的對象。

由於C是純粹通按值,被模擬的指針:

調用者傳遞的對象的被叫方應該修改的地址,和被呼叫者取消引用所接收的指針修改意目標。

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

void euclidean(int a, int b, int * q, int * r) 
{ 
    // Modify the target-objects q and r point to 
    *q = a/b; 
    *r = a % b; 
} 

int main() { 
    int q, r; // Not pointers, the objects themselves! 
    euclidean(5, 4, &q, &r); // Passing the addresses of q and r 
    printf("q = %d, r = %d", q, r); 
} 

根本沒有動態分配。

void euclidean(int a, int b, int * q, int * r) 
{ 
    *q = a/b;  <<<<<<<<<<<<<<<<< 
    *r = a % b; 

    //printf("q = %d, r = %d", *q, *r); //this won't show 

    return; 
} 

無論你在主也不在歐幾里得分配的內存爲Q,R - :

1

你,因爲沒有爲listing_2獲取值。由於您試圖尊重未初始化爲任何內容的指針,因此出現錯誤。