我有一個一年前撰寫的圖形代碼,現在不起作用(AFAIR 它起作用了)。該圖是用一個方陣實作的,該方陣分別與對角線對稱。我省略了很多代碼,以使其盡可能清晰,這仍然足以讓錯誤持續存在。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct
{
int **matrix;
unsigned size;
} graph;
void init(graph *gptr, int *matrix[], unsigned size)
{
gptr->size = size;
gptr->matrix = malloc(gptr->size * sizeof(*gptr->matrix));
for (unsigned i = 0; i < gptr->size; i )
gptr->matrix[i] = malloc(gptr->size * sizeof(**gptr->matrix));
for (unsigned i = 0; i < gptr->size; i )
for (unsigned j = 0; j <= i; j )
gptr->matrix[i][j] = gptr->matrix[j][i] = matrix[i][j];
}
void add_vertex(graph *gptr, unsigned vertex)
{
for (unsigned i = 1; i < gptr->size; i )
if (gptr->matrix[i][0] == vertex) return;
gptr->size ;
gptr->matrix = realloc(gptr->matrix, gptr->size * sizeof(*gptr->matrix));
for (unsigned i = 0; i < gptr->size; i )
/* ERROR */
gptr->matrix[i] = realloc(gptr->matrix[i], gptr->size * sizeof(**gptr->matrix));
gptr->matrix[gptr->size - 1][0] = gptr->matrix[0][gptr->size - 1] = vertex;
for (unsigned i = 1; i < gptr->size; i )
gptr->matrix[gptr->size - 1][i] = gptr->matrix[i][gptr->size - 1] = -1;
}
#define EDGES 7
#define RANDOM(min, max) min rand() / ((RAND_MAX - 1) / (max - min))
#define MIN -1
#define MAX 9
int **getMatrix(unsigned size)
{
int **matrix = malloc(size * sizeof(*matrix));
for (unsigned i = 0; i < size; i )
{
matrix[i] = malloc((i 1) * sizeof(**matrix));
matrix[i][0] = i;
}
for (unsigned i = 1; i < size; i )
{
for (unsigned j = 1; j < i; j )
do
matrix[i][j] = RANDOM(MIN, MAX);
while (!matrix[i][j]);
matrix[i][i] = rand() % 2 - 1;
}
return matrix;
}
int main(void)
{
int **matrix = getMatrix(EDGES 1);
graph x;
init(&x, matrix, EDGES 1);
add_vertex(&x, EDGES 1);
}
在gptr->matrix[i] = realloc(gptr->matrix[i], gptr->size * sizeof(**gptr->matrix));程式被例外暫停Trace/breakpoint trap。我已經用谷歌搜索了一段時間,對我來說,我的重新分配很可能有問題,但我不知道出了什么問題。此外,它在clang甚至在線上運行良好,gcc 7.4而在我的gcc 8.1. 誰能看出我錯在哪里?
uj5u.com熱心網友回復:
上的第一個條目到add_vertex,gptr->size == 8并gptr->matrix點到8個指標陣列以malloc分配存盤器。
gptr->size ;
現在gptr->size == 9。
gptr->matrix = realloc(gptr->matrix, gptr->size * sizeof(*gptr->matrix));
現在gptr->matrix指向一個包含 9 個指標的陣列。 gptr->matrix[0] .. gptr->matrix[7]是之前有效的 malloc 指標,gptr->matrix[8]包含未初始化的垃圾。
for (unsigned i = 0; i < gptr->size; i )
/* ERROR */
gptr->matrix[i] = realloc(gptr->matrix[i], gptr->size * sizeof(**gptr->matrix));
因為gptr->size == 9,這迭代了 9 次,在第 9 次迭代時,垃圾指標gptr->matrix[8]被傳遞給realloc。不好。
您可以gptr->size - 1改為迭代回圈時間,并gptr->matrix[gptr->size - 1] = malloc(...)單獨初始化。或者有點懶惰并避免代碼重復,您可以gptr->matrix[gptr->size - 1] = NULL在此回圈之前進行初始化,保持迭代gptr->size次數,并依靠realloc(NULL, sz)等效于malloc(sz).
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/364674.html
