我在通過指標從其他函式訪問 typedef 中的二維陣列時遇到問題,即使我在堆中分配陣列!
#include <stdlib.h>
#include <stdio.h>
typedef struct {
int a;
int b;
int **data;
} Image;
Image *createImage(int a, int b) {
Image createImage;
createImage.data = malloc(a * sizeof(int *));
for (int i = 0; i < a; i ) {
createImage.data[i] = malloc(b * sizeof(int));
}
Image *imagePointer = malloc(sizeof(Image));
imagePointer = &createImage;
return imagePointer;
}
int main () {
int a = 70;
int b = 90;
Image *imagePointer = createImage(a, b);
for (int i = 0; i < a; i ) {
for (int j = 0; j < b; j ) {
imagePointer->data[i][j] = i j;
}
}
}
加載影像時出現錯誤,因為我在訪問分配的存盤時做錯了。我應該改變什么?
喬納森
uj5u.com熱心網友回復:
而不是回傳一個指標來Image回傳區域變數本身并且它可以作業。變數名和函式名也不應該相同createImage,有時會造成混淆。
#include <stdlib.h>
typedef struct {
int a;
int b;
int **data;
} Image;
Image createImage(int a, int b) {
Image ci;
ci.data = malloc(a * sizeof(int *));
for (int i = 0; i < a; i ) {
ci.data[i] = malloc(b * sizeof(int));
}
return ci;
}
int loadImage () {
int a = 70;
int b = 90;
Image imagePointer = createImage(a, b);
for (int i = 0; i < a; i ) {
for (int j = 0; j < b; j ) {
imagePointer.data[i][j] = i j;
}
}
}
int main(int argc, char const *argv[])
{
loadImage();
return 0;
}
uj5u.com熱心網友回復:
- 它不是二維陣列,只是一個指標陣列。
- 用于
size_t尺寸 - 使用物件而不是型別
sizeof - 經常檢查結果
malloc
我會使用靈活的陣列成員和陣列指標來洗掉一級間接并簡化分配和釋放(只需要一個 malloc/free)
typedef struct {
size_t a;
size_t b;
unsigned data[];
} Image;
Image *createImage(const size_t a, const size_t b)
{
Image *imagePointer;
imagePointer = malloc(sizeof(*imagePointer) a * b * sizeof(imagePointer -> data[0]));
if(imagePointer)
{
imagePointer -> a = a;
imagePointer -> b = b;
}
return imagePointer;
}
int main (void)
{
const size_t a = 70;
const size_t b = 90;
Image *imagePointer = createImage(a, b);
if(imagePointer)
{
unsigned (*image)[imagePointer -> b] = (unsigned (*)[imagePointer -> b])imagePointer -> data;
for (size_t i = 0; i < a; i )
{
for (size_t j = 0; j < b; j )
{
image[i][j] = i j;
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/430736.html
下一篇:編譯器說變數未宣告,即使它已宣告
