【发布时间】: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->array = (int *)malloc(initialSize * sizeof(char));-->a->array = (char *)malloc(initialSize * sizeof(char));2)char C;-->int C;3) 需要#include <stdlib.h> -
除了上面的 cmets 之外,似乎没有任何问题(即使没有更正,MSVC 也不会崩溃)。但这真的是Minimal, Complete, and Verifiable example吗?我想知道不必要的
#include "header3.h"是干什么用的。 -
这些功能的接口很糟糕。有两组函数,一组处理 char 数组,另一组处理 int 数组。
标签: c exception dynamic-arrays