2016-10-04 163 views
-2

因此,我將代碼範圍縮小到我需要幫助的地方。對不起,以前的文字和拼湊代碼牆。雙指針,動態分配和使用指針數組

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

// Function Protype 
void test_function(int **ptr2); 

// Main Function 
int main(void) { 
    int *ptr1; 
    int i = 0; // Counter 

    test_function(&ptr1); // Calling function 

    for (i = 0; i < 10; i++) { 
     printf("%d", ptr[i]); // Should print numbers from 0-9 
    } 

    return 0; 
} 

// Custom Function 
void test_function(int **ptr2) { 
    // Variables 
    int i = 0; // Counter 
    int j = 0; // Dynamic allocator 

    *ptr2 = malloc(sizeof(int) * j); // Allocates 10 slots of size int 

    for (i = 0; i < 10; i++) { 
     *ptr2[i] = i; // <----- This line gives a segmentation fault error 
    } 

    return; 
} 

因此,基本上,這個程序應該通過陣列使用malloc分配j的動態大小,輸入數字0-9和顯示0-9向用戶進行迭代。然而,被註釋的函數test_function中的行給我一個分段錯誤錯誤。

+1

使用調試器。至少它會告訴你哪一行代碼觸發了seg錯誤,這是你應該與我們分享的信息。另外,試着讓你的問題簡潔:代碼,它應該做什麼以及它實際上在做什麼。例如,爲什麼要顯示兩個版本的代碼?我們應該從中得到什麼,你真的在​​問哪一個? – kaylum

+0

安裝GDB(GNU調試器)需要10分鐘才能確定你的錯誤 – tesseract

+0

我們應該如何調試整個程序?減少它。 –

回答

1

*ptr2[i] = i;應是:

(*ptr2)[i] = i; 

你有辦法就意味着*(ptr2[i])這是一個錯誤,因爲ptr2僅指向一件事。

0

int *spacePos = NULL;

find_spaces(name, &spaceCount, &spacePos);

SpacePos已經是一個指針,指向一個int,指針指向存儲器的一些空間,其中整數被存儲。這個指針地址存儲在地址&SpacePos的內存中,在你的數據段的某個地方存儲在內存Where in memory are my variables stored in c?中。

當您將'SpacePos'的地址傳遞給一個函數並對其進行操作時,您實際上正在更改存儲在SpacePos中的指針值,而不是其指向的內容,並且會導致seg錯誤。 (你根本改變存儲在SpacePos的內存地址,你現在指向無效的內存)

What does "dereferencing" a pointer mean?

嘗試find_spaces(name, &spaceCount, spacePos); 希望它能幫助。

######################### PART 2

void test_function(int **ptr2) {

int i = 0; // Counter 
int j = 10; // Dynamic allocator 
*ptr2 = malloc(sizeof(int) * j); // Allocates 10 slots of size int 

for (i = 0; i < 10; i++) { 
    *((*ptr2)+i) = i; // <----- This line gives a segmentation fault error 
} 

return; 

}

+0

我想他想通過'&spacePos',這樣'find_spaces'函數可以動態分配一個數組來存儲「返回值」 –

+0

是的你的權利(我的錯誤)我會留下我的評論因爲它可能對OP有用,但不給我任何觀點,在這種情況下,標準對流應該說'void * spacepos = NULL',並且在他分配內存時在稍後的階段施放它,因爲它可能會引起誤解? – tesseract

+0

不,int * spacePos是正確的,因爲它確實會指向'int' –