2016-03-10 50 views
0

我已經創建了一個C結構類型爲這樣:指針結構返回錯誤值用C

typedef struct { 
    int* data; 
    unsigned int len; 
} intarr_t; 

我試圖從一個指針中存取權限len到我(顯然)成功創建intarr_t對象。下面是兩個文件,這我在這裏工作......

intarr.h

/* Structure type that encapsulates our safe int array. */ 
typedef struct { 
    int* data; 
    unsigned int len; 
} intarr_t; 

/* A type for returning status codes */ 
typedef enum { 
    INTARR_OK, 
    INTARR_BADARRAY, 
    INTARR_BADINDEX, 
    INTARR_BADALLOC, 
    INTARR_NOTFOUND 
} intarr_result_t; 


// Create a new intarr_t with initial size len. If successful 
// (i.e. memory allocation succeeds), returns a pointer to a 
// newly-allocated intarr_t. If unsuccessful, returns a null pointer. 
intarr_t* intarr_create(unsigned int len); 

// If index is valid, set the value at ia->data[index] to val and return 
// INTARR_OK. Otherwise, leave the array unmodified and return 
// INTARR_BADINDEX. If ia is null, return INTARR_BADARRAY. 
intarr_result_t intarr_set(intarr_t* ia, 
       unsigned int index, 
       int val); 

intarr.c

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

intarr_t* intarr_create(unsigned int len) { 

    intarr_t original; 
    original.len = len; 
    original.data = malloc(original.len * sizeof(int)); 

    //populate with values 
    for (int i = 0; i < original.len; i++) { 
     original.data[i] = i; 
    } 

    if (original.data == 0) { 
     intarr_t* originalp = NULL; 
     return originalp; 
    } 

    else { 
     intarr_t* originalp = &original; 
     return originalp; 
    } 
} 

intarr_result_t intarr_set(intarr_t* ia, 
       unsigned int index, 
       int val) { 

    if (ia == NULL) { 
     printf("%s\n", "error: array is null"); 
     return INTARR_BADARRAY; 
    } 

    else if (index) { //need to check bounds properly here with ia->len, but it won't work 
     ia->data[index] = val; 
     //printf("length of array: %d\n", ia->len); 
     return INTARR_OK; 
    } 

    return INTARR_BADINDEX; 
} 



int main() { 
    intarr_t* arr = intarr_create(11); 
    intarr_t* arra = NULL; 
    intarr_set(arr, 80, 420); 
    return 0; 
} 

要檢查intarr_set()索引範圍,我想查看索引值,看它是否在0和ia->len之間。但是,ia->len正在返回420而不是主要指定的11。不應ia->len具有自intarr_create()值11產生的intarr_t對象指向original爲11 len?爲什麼是這樣? val不是intarr_t結構的一部分。這只是一個參數。我試圖在的arr上運行。

現在我已經寫了if (index)只是爲了使程序編譯正確,直到這被調試。

intarr_set()index返回正確的值。

val in intarr_set()返回正確的值。

intarr_create()len返回正確的值。

即使dataoriginal,originalparr包含正確的值。

ia->len不會返回正確的值。

爲什麼?

有人能告訴我什麼,我在這裏失蹤?謝謝。

+0

免得我們曾經厭倦[閱讀本(http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope)。 – WhozCraig

回答

2

問題是這樣的:

intarr_t original; 
... 
intarr_t* originalp = &original; 
return originalp; 

你返回一個指針到一個局部變量。局部變量超出範圍,並且一旦它們在返回中定義的函數就不復存在。

如果你想真正創建結構的實例,你應該動態地(例如帶malloc)分配它。