【问题标题】:falls after input输入后下降
【发布时间】:2013-11-30 02:54:41
【问题描述】:

我在这里做错了什么?它在我输入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;
}

【问题讨论】:

  • 如果您认为array_create()(方便地从发布的源代码中省略)在某种程度上微不足道并且与您的问题无关,那么您可能错了。发布它。
  • 你的函数有时什么也不返回,你的编译器没有告诉你吗?
  • 你有编译器吗??
  • 如果你不明白查理说什么,让我为你拼写出来。你的函数被定义为返回一个array_t。该函数中的任何地方只是 return; 是未定义的行为。
  • 不需要动态分配整个结构。 C 支持结构的按值复制。在您的情况下,唯一不同的是分配的向量的长度。查理答案中的分配器是一种明显更好的方法。此外,如果你要照原样做,那么你的数学是错误的(你不应该这样做,并且泄漏内存,顺便说一句)。数学应该是sizeof(*newArr) + count*sizeof(int) 但这不是解决这个问题的方法。

标签: c struct return recycle-bin


【解决方案1】:

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 是您正在寻找的。​​p>

#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;
}

【讨论】:

  • 我们必须发布一个有效的版本。我们不能只说那个(当然,当我看到它弹出时我笑了)。
  • 如果你愿意,我会删除...我有'balls'复数我的错误。听起来有点不确定。
  • 点赞:my balls feel like a pair of maraka's?
  • 我添加了我的array_create 函数。我必须同时传递 arr 和 count 作为参数。这是一个要求
  • 你在做什么没有意义。如果 arr 必须传入,它应该包含什么或在返回时设置为什么。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多