所以我寫了一個矩陣,其中包含一個結構像素。該代碼似乎將標準像素寫入矩陣,但是當我嘗試打印出內容時,它似乎指向了錯誤的地址,因爲AddressSanitizer即將出現,即printf正在從錯誤地址讀取: 這裏是該代碼與測試的printf()分配:從矩陣讀取,分配malloc,AddressSanitizer:堆緩衝區溢出
#include <stdio.h>
#include <stdlib.h>
#include "matrx.h"
#include "pixel.h"
void matr_initializer(struct matrix* matr, int w, int h){
matr->height = h;
matr->width = w;
struct pixel p;
standardPixel(&p);
matr->grid = (struct pixel**)malloc(sizeof(struct pixel)*w);
if(matr->grid == NULL){
fprintf(stderr,"Irgendwas lief beim allozieren verkehrt");
abort();
}
for(int i = 0; i < w; i++){
matr->grid[i] = (struct pixel*)malloc(sizeof(matr->grid)*h);
}
for(int i = 0; i < w; i++){
for(int j = 0; j < h; j++){
matr->grid[i][j] = p;
/*Here is the printf that causes the error*/
printf("%d %d %d ",matr->grid[i][j].r,matr->grid[i][j].g,matr->grid[i][j].b);
}
printf("\n");
}
matr->n = w*h;
matr->init = 1;
}
這裏是頭文件我使用:
#ifndef _MATRH_
#define _MATRH_
#include <stdio.h>
#include <stdlib.h>
#include "pixel.h"
// typedef struct matrix matrix;
struct matrix{
int height;
int width;
struct pixel* spalten;
struct pixel** grid;
int n;
int init;
};
void matr_initializer(struct matrix* matr, int w, int h);
void printf_matr_color(struct matrix* matr);
void printf_matr_RGB(struct matrix* matr);
#endif
而且pixel.h
#ifndef _PIXELH_
#define _PIXELH_
#include <stdio.h>
#include <stdlib.h>
struct pixel{
int color;
int r,g,b;
int brightness;
int energy;
};
void standardPixel(struct pixel* p);
#endif
理想情況下,這可以通過使用gdb來解決。但是你可以通過做'matr-> grid =(struct pixel *)malloc(sizeof(struct pixel)* w * h);''來讓你的生活更輕鬆。你認爲'sizeof(matr-> grid)* h'的作用是什麼? – James
這是真的,我已經想過,但現在好奇,爲什麼這是行不通的,它似乎沒有任何問題 –