【问题标题】:Dynamic Arrays in C - Exception thrownC中的动态数组 - 抛出异常
【发布时间】:2015-12-30 13:53:35
【问题描述】:

我已经开始在 C 中使用动态数组,但遇到异常抛出运行时错误:

Assignment 3.exe 中 0x00007FF7ECB21A87 处引发异常:0xC0000005:访问冲突写入位置 0xFFFFFFFFE7CBC420。

这发生在insertArray() 函数中,就在我尝试将char 元素存储在struct Array 中找到的数组变量中时(见下文):

代码:

#include <stdio.h>
#include "header3.h"

typedef struct {
    char *array;
    size_t used;
    size_t size;
} Array;

typedef struct {
    int *array;
    size_t used;
    size_t size;
} intArray;

void initArray(int option, Array *a, intArray *b, size_t initialSize) {
    if (option == 1) {
        a->array = (int *)malloc(initialSize * sizeof(char));
        a->used = 0;
        a->size = initialSize;
    }
    else {
        b->array = (int *)malloc(initialSize * sizeof(int));
        b->used = 0;
        b->size = initialSize;
    }
}

void freeArray(int option, Array *a, intArray *b) {
    if (option == 1) {
        free(a->array);
        a->array = NULL;
        a->used = a->size = 0;
    }
    else {
        free(b->array);
        b->array = NULL;
        b->used = b->size = 0;
    }
}

void insertArray(int option, Array *a, intArray *b, char element, int element2) {
    if (option == 1) {
        if (a->used == a->size) {
            a->size *= 2;
            a->array = (char *)realloc(a->array, a->size * sizeof(char));
        }
        a->array[a->used++] = element; //ERROR HERE
    }
    else {
        if (b->used == b->size) {
            b->size *= 2;
            b->array = (int *)realloc(b->array, b->size * sizeof(int));
        }
        b->array[b->used++] = element2;
    }
}


int main() {
    Array eq, postFx;
    initArray(1, &eq, 0, 2);  // initially 2 elements
    initArray(1, &postFx, 0, 2);
    int i;
    char C;
    printf("Enter character string\n");
    while ((C = getchar()) != EOF)
        insertArray(1, &eq, 0, C, 0);  // automatically resizes as necessary
    //int n = expEvaluate(eq, (eq.used)-1, postFx); //call expEvaluate to process eq
    //printf("\nAnswer: %d", n);
    int chk = getchar(); //readkey (twice)
    freeArray(1, &eq, 0);
    chk = getchar();

    return 0;
}

我似乎无法掌握这个窍门,我可能遗漏了一些明显的东西,或者问题比这更大......无论哪种方式,不胜感激!

【问题讨论】:

  • 花点时间学习如何使用调试器。
  • 好吧,我知道如何使用调试器,感谢调试器,我确切知道抛出异常的位置,但不幸的是我不知道代码有什么问题
  • 1) a-&gt;array = (int *)malloc(initialSize * sizeof(char)); --> a-&gt;array = (char *)malloc(initialSize * sizeof(char)); 2) char C; --> int C; 3) 需要#include &lt;stdlib.h&gt;
  • 除了上面的 cmets 之外,似乎没有任何问题(即使没有更正,MSVC 也不会崩溃)。但这真的是Minimal, Complete, and Verifiable example吗?我想知道不必要的#include "header3.h" 是干什么用的。
  • 这些功能的接口很糟糕。有两组函数,一组处理 char 数组,另一组处理 int 数组。

标签: c exception dynamic-arrays


【解决方案1】:
  1. 在 initArray: [ int allocate: ( int *) ... ]

    a->array = (int *)malloc(initialSize * sizeof(char));
    

    在 insertArray: [ char allocate: ( char *) ... ]

    a->array = (char *)realloc(a->array, a->size * sizeof(char));
    

这会导致问题。

  1. 使用 gdb:GNU 调试器

【讨论】:

    猜你喜欢
    • 2020-06-22
    • 2019-09-05
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多