提问人:pedram 提问时间:1/5/2023 更新时间:1/5/2023 访问量:49
C 动态阵列被信号 SIGSEGV 中断
C dynamic array interrupted by signal SIGSEGV
问:
我正在尝试用 C 编写一个动态数组(大小和类型是动态的)。
首先,我编写了一个函数来初始化数组。输入是一个枚举 (TYPE),根据此参数的值,我为相应的类型分配内存。
这是我初始化数组的方式:
...
typedef enum {
CHAR,
INT,
FLOAT,
DOUBLE,
BOOLEAN,
} TYPE;
...
struct vector_result {
TYPE type;
int len;
void* data;
};
...
struct vector_result DSTR_vector_init(TYPE type){
void* data;
switch (type) {
case CHAR:
data = (char*) malloc(0);
break;
case INT:
data = (int*) malloc(0);
break;
case FLOAT:
data = (float*) malloc(0);
break;
case DOUBLE:
data = (double*) malloc(0);
break;
case BOOLEAN:
data = (bool*) malloc(0);
break;
default:
fprintf(stderr, "unknown type to initialize vector\n");
exit(EXIT_FAILURE);
}
struct vector_result result;
result.type = type;
result.data = data;
result.len = 0;
return result;
}
这就是我调整大小并将数据附加到列表的方式:
void DSTR_vector_push(struct vector_result* vector, void* value){
vector->len++;
switch (vector->type) {
case CHAR:
vector->data = (char*) realloc(vector->data, get_type_size(vector->type) * vector->len);
((char*)vector->data)[vector->len-1] = *(char*) value;
break;
case INT:
vector->data = (int*) realloc(vector->data, get_type_size(vector->type) * vector->len);
((int*)vector->data)[vector->len-1] = *(int*) value;
break;
case FLOAT:
vector->data = (float*) realloc(vector->data, get_type_size(vector->type) * vector->len);
((float*)vector->data)[vector->len-1] = *(float*) value;
break;
case DOUBLE:
vector->data = (double*) realloc(vector->data, get_type_size(vector->type) * vector->len);
((double*)vector->data)[vector->len-1] = *(double*) value;
break;
case BOOLEAN:
vector->data = (bool*) realloc(vector->data, get_type_size(vector->type) * vector->len);
((bool*)vector->data)[vector->len-1] = *(bool*) value;
break;
default:
fprintf(stderr, "unknown type to initialize vector\n");
exit(EXIT_FAILURE);
}
}
下面的代码正在初始化并将一个项目附加到列表中
struct vector_result int_vec = DSTR_vector_init(INT);
DSTR_vector_push(&int_vec, 10);
但是我在执行后收到此错误:
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
问题是什么?
答:
1赞
Some programmer dude
1/5/2023
#1
我猜主要问题是这个:
*(int*) value;
将值传递给函数。它不是有效的指针,不能取消引用。尝试取消引用将导致未定义的行为(并可能崩溃)。int
10
10
您需要将该值用作实际值,而不是指针:
DSTR_vector_push(&int_vec, (void *) (intptr_t) 10);
和
((int*)vector->data)[vector->len-1] = (int) (intptr_t) value;
几乎所有其他情况都存在同样的问题。
例外情况是 ,因为它是实现定义的,如果已签名或未签名。您需要按原样使用以保留位,而不是保留值。char
char
uintptr_t
评论
malloc(0)
realloc
free
malloc
、calloc
或realloc
(或任何其他返回的函数)的结果。考虑到这是一个,为什么还要首先铸造?void *
data
void *
malloc(0);
float
char