2014-02-21 66 views
0

請幫忙解決了這個program.I'm嘗試使用指針,而不是陣列打印指針數組的功能,但我得到這個錯誤:傳球達陣使用指針

enter number of element:5 
array[0]=1 
array[1]=2 
array[2]=3 
array[3]=4 
array[4]=5 
Segmentation fault 

這是代碼:

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

int *array; 
int n; 

void input(int *array,int n); 
void display(int *array,int n); 
int sum(int *array,int n); 

int main (void) { 
    int result; 
    printf("enter number of element:");scanf("%d",&n); 
    input(array,n); 
    display(array,n); 
    result=sum(array,n); 
    printf("sum of array=%d",result); 
    return 0; 
} 

void input(int *array,int n){ 
    int j; 
    array=(int *)malloc(n*sizeof(int)); 
    for(j=0;j<n;j++){ 
     printf("array[%d]=",j);scanf("%d",array+j); 
    } 
} 

void display(int *array,int n){ 
    int j; 

    for(j=0;j<n;j++){ 
     printf("%d\t",*(array+j)); 
    } 
    printf("\n"); 
} 

int sum(int *array,int n){ 
    int sum=0,j; 

    for(j=0;j<n;j++){ 
     sum+=*array+j; 
    } 
    return sum; 
} 

我怎樣才能修復這個代碼?請解釋人我有什麼錯代碼

+0

刪除陣列從輸入函數的參數。它將工作 – 999k

+0

@ 555k敢於解釋,爲什麼? – m0skit0

+0

@ m0skit0請從下方巴拉克馬諾斯檢查答。對不起,我有點忙,只是想幫助他。 – 999k

回答

3

變量array在功能input一個局部變量。

因此,用array = ...來設置它是沒有意義的,因爲這個賦值在裏面只有的作用。你通常應該通過其地址(&array)到需要改變它的任何功能。

在你的具體的例子,你也有一個全局變量array,所以一個快速解決問題的方法是簡單地調用函數input沒有通過可變array作爲參數:

void input(int n) 
{ 
    ... 
    array = (int*)malloc(n*sizeof(int)); 
    ... 
} 

int main() 
{ 
    ... 
    input(n); 
    ... 
} 

注意,這是一個「髒」的解決方法,你通常應該努力避免使用全局變量。

1

要乾淨的版本添加到barak's answer

int input(int ** array, const size_t n) 
{ 
    int result = 0; 

    assert(NULL != array); 

    (*array) = malloc(n * sizeof(**array)); 
    if (NULL == (*array)) 
    { 
    result = -1; 
    } 
    else 
    { 
    size_t j; 
    for(j = 0; j < n; ++j) 
    { 
     printf("array[%zu]=", j); 
     scanf("%d", (*array) + j); /* still missing error checking here . */ 
    } 
    } 

    return result; 
} 

,並調用它是這樣的:

if (-1 == input(&array, n)) 
{ 
    perror("input() failed"); 
    exit(EXIT_FAILURE); 
} 
0

試試這個input()

void input(int **array,int n){ 
    int j; 
    *array=(int *)malloc(n*sizeof(int)); 
    for(j=0;j<n;j++){ 
     printf("array[%d]=",j);scanf("%d",*array+j); 
    } 
} 

因爲C通過使用逐值,如果要更改函數中某個變量的值,則需要傳遞地址s作爲該函數的參數。

在這種情況下,你想改變的arrayinput()和價值array類型是int *,因此的input()原型應該像void input (int **array, ...)

0

是什麼*陣列+ J呢?它評估*數組並將j添加到它嗎?或者它是否將j添加到數組,然後對其進行解引用?如果我告訴你你錯了,你會願意下注100美元嗎?

通過使用圓括號或更好的寫數組[j],使您的生活和任何人的生活更輕鬆地閱讀您的代碼。

0

這應該do..make確保您瞭解什麼其他人說..

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

int *array; 
int n; 


void input(int **array,int n); 
void display(int **array,int n); 
int sum(int **array,int n); 

int main (void) { 
int result; 
printf("enter number of element:");scanf("%d",&n); 
input(&array,n); 
display(&array,n); 
result = sum(&array,n); 
printf("sum of array= %d",result); 
return 0; 
} 

void input(int **array,int n){ 
int j; 
*array= malloc(n*sizeof(int)); 
for(j=0;j<n;j++){ 
    printf("array[%d]=",j); 
    scanf("%d",(*array)+j); 
} 
} 

void display(int **array,int n){ 
int j; 

for(j=0;j<n;j++){ 
    printf("%d\t",*((*array)+j)); // you can use array notation aswell 
            //array[0][j] will work 
} 
printf("\n"); 
} 

int sum(int **array,int n){ 
int sum=0,j; 

for(j=0;j<n;j++){ 
    sum += *((*array)+j); 
} 
return sum; 
}