Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pebble在“realloc”上崩溃,但仅在某个函数中崩溃_C_Memory Management_Realloc_Pebble Sdk - Fatal编程技术网

Pebble在“realloc”上崩溃,但仅在某个函数中崩溃

Pebble在“realloc”上崩溃,但仅在某个函数中崩溃,c,memory-management,realloc,pebble-sdk,C,Memory Management,Realloc,Pebble Sdk,我在Pebble应用程序中使用自定义向量。 Pebble在调用realloc时崩溃 main.c #include <pebble.h> #include "movement.h" static PointArray point_array; int main(void) {; point_array_create(&point_array, 1); GPoint point1 = (GPoint){.x = 1, .y = 1}; GPoint

我在Pebble应用程序中使用自定义向量。 Pebble在调用
realloc
时崩溃

main.c

#include <pebble.h>
#include "movement.h"

static PointArray point_array;

int main(void) {;
    point_array_create(&point_array, 1);
    GPoint point1 = (GPoint){.x = 1, .y = 1};
    GPoint point2 = (GPoint){.x = 2, .y = 2};
    GPoint point3 = (GPoint){.x = 3, .y = 3};

    point_array_push(&point_array, point1);
    point_array_push(&point_array, point2);
    point_array_push(&point_array, point3);
    APP_LOG(APP_LOG_LEVEL_DEBUG, "Done\n");
}
#include "movement.h"
#include "pebble.h"


static void point_array_resize(PointArray *point_array){
  point_array->capacity *= 2;
  size_t new_size = point_array->capacity * sizeof(GPoint) + sizeof(GPoint);
  point_array->points = (GPoint*)realloc(point_array->points, new_size);
}


void point_array_create(PointArray *arr, int capacity) {
    arr->points = (GPoint*)malloc(capacity * sizeof(GPoint));
    arr->length = 0;
    arr->capacity = capacity;
}

void point_array_push(PointArray *point_array, GPoint point) {

  APP_LOG(APP_LOG_LEVEL_DEBUG, "pushing");

  if (point_array->length > point_array->capacity) {
    APP_LOG(APP_LOG_LEVEL_DEBUG, "resizing");
    point_array_resize(point_array);
    APP_LOG(APP_LOG_LEVEL_DEBUG, "successful resize");
  }
  point_array->points[point_array->length] = point;
  point_array->length++;
  APP_LOG(APP_LOG_LEVEL_DEBUG, "+ length");
}
移动.h

#include <pebble.h>
#include <stdlib.h>
#include <math.h>

typedef struct {
  GPoint *points;
  int length;
  int capacity;
} PointArray;

void point_array_create(PointArray *arr, int capacity);

void point_array_push(PointArray *point_array, GPoint point);

void point_array_destroy(PointArray *point_array, GPoint point);

GPoint move(GPoint point, float distance, float degrees);
以下是我尝试过的:

  • 代码在GCC和Clang(!)上都运行良好
  • 我验证了
    point\u array
    point\u array->points
    不为空且
  • new\u size
    大于
    point\u array->points
    的现有大小
  • 我看了一下,这似乎不适用
  • 我尝试调用
    point\u array\u create
    底部的
    realloc
    ,效果很好。它只是在
    点数组\u resize
    中不起作用

点阵列推送中,您可以测试是否需要调整顶部点的大小,但测试错误。仅当长度超过容量时才调整大小,这意味着您已经超出了阵列的容量

相反,检查长度是否已达到容量

  if (point_array->length == point_array->capacity) {
    APP_LOG(APP_LOG_LEVEL_DEBUG, "resizing");
    point_array_resize(point_array);
    APP_LOG(APP_LOG_LEVEL_DEBUG, "successful resize");
  }

如果初始容量为
0
,则调整大小代码不起作用。调整大小时应确保容量不为零。@chqrlie good point-容量不为零,并且
point\u array->points
中包含内容。例如
point\u array->points[0].x==10
程序的其他部分可能存在隐藏内存冲突。如果您的程序或程序的一部分在x86 linux上运行,请尝试valgrind并确保没有看到与您的程序相关的任何错误。为什么要在
resize
中重新分配额外的插槽,而不是在
create
foo=realloc(foo,一些大小)
总是错误的(除非
foo
保证为
NULL
,但只需写入
NULL
,而不是
foo
),因为这可能是内存泄漏<代码>realloc
在出现故障时不会
释放
  if (point_array->length == point_array->capacity) {
    APP_LOG(APP_LOG_LEVEL_DEBUG, "resizing");
    point_array_resize(point_array);
    APP_LOG(APP_LOG_LEVEL_DEBUG, "successful resize");
  }