1

我在这里做错了什么?count它在我输入然后我的数组之后下降它一定是内存分配的东西,但我尝试了很多东西,但没有一个有帮助。感谢您的回复

struct _arr {
   size_t count;
   int* arr;
};

typedef struct _arr array_t;

array_t array_create(int* arr, size_t count){
    array_t* newArr;

    newArr = (array_t*)malloc(sizeof(count)+sizeof(int)*count);
    newArr->count = count;
    newArr->arr = arr;
    return *newArr;
}


array_t array_get(FILE* file){
    int* arr = NULL;
        size_t count;
    array_t arr_t;
    int i = 0;

    if (!file) return;
    if (!fscanf(file, "%u", &count)) return;
    arr_t = array_create(arr, count);

    for (i = 0; i < arr_t.count; i++){
        if (!fscanf(file, "%d", &arr_t.arr[i])) return;
    }

    for (i = 0; i<arr_t.count; i++)
    printf("%d ", arr_t.arr[i]);
    printf("\n");

    return arr_t;
}


int main(){
    array_t arr;
    int i = 0;

    arr = array_get(stdin);

    for (i = 0; i<arr.count; i++)
        printf("%d ", arr.arr[i]);

    getch();
    return 0;
}
4

2 回答 2

2

WhozCraig 的水晶球说你的问题出在array_create(). 具体来说,该字段arr未正确分配。你array_create()应该看起来像这样:

array_t array_create(int length)
{
    array_t res = {length, NULL};
    if (length > 0) {
        res.arr = malloc(length * sizeof(*res.arr));
        if(res.arr == NULL) {
            printf("malloc(%d) failed\n", length * sizeof(*res.arr));
            exit(1);
        }
    }
    return res;
}

您还需要修复那些空的回报。也许您只想打印一条消息并退出。


2013 年 11 月 18 日星期一 16:13:48 CST 更新

这是一个完全不同的版本,它从堆中分配一个 array_t。错误处理有点难看(所有那些返回 0; 的地方)。这应该有效,另一个也有效,但也许堆上的 array_t 是您正在寻找的。

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

typedef struct {
   size_t count;
   int *arr;
} array_t;

array_t *array_create(size_t count){
    array_t *newArr = malloc(sizeof(array_t));
    if(newArr == 0) return 0;
    newArr->count = count;
    newArr->arr = calloc(sizeof(int),count);
    if(newArr->arr == 0) return 0;
    return newArr;
}

array_t *array_get(FILE* file){
    size_t count;
    array_t *arr;
    int i = 0;

    if (!file) return 0;
    if (!fscanf(file, "%zu", &count)) return 0;
    arr = array_create(count);
    if(arr == 0) return 0;

    for (i = 0; i < arr->count; i++){
        if (!fscanf(file, "%d", &arr->arr[i])) return 0;
    }

    for (i = 0; i<arr->count; i++)
        printf("%d ", arr->arr[i]);
    printf("\n");

    return arr;
}


int main(void) {
    array_t *arr;
    int i = 0;

    arr = array_get(stdin);
    if(arr == 0) return -1;

    for (i = 0; i<arr->count; i++)
        printf("%d ", arr->arr[i]);

    getch(); // getch is windows
    return 0;
}
于 2013-11-16T19:36:20.927 回答
0

根据我的说法,您正试图返回该地址上存在的具有指针的值。所以只需简单地返回 newArr

于 2013-11-16T21:07:04.660 回答