calloc 导致错误访问
calloc causes Bad Access
我的 main
函数是这样的:
int main() {
//
double minW, minL, width, length;
unsigned tileCap = 10;
auto *tiles = (Tile*)calloc(tileCap, sizeof(Tile) );
GetInput(&minW, &minL, &tiles, &tileCap);
}
而我的 GetInput()
将读取并保存到 Tile
的数组中:
void GetInput(double *w, double *l, Tile **tiles, unsigned *tileCap) {
//
printf("Tile:\n");
double tileSize, tileJoint;
int argc;
unsigned tileCount = 0;
do {
argc = scanf("%lf %lf", &tileSize, &tileJoint);
if (tileSize == 0 || !CorrectSize(tileSize) || !CorrectSize(tileJoint) || argc != 2)
BadInput();
bool needTransform = HasFloatingPoint(tileSize);
if(needTransform) {
tileSize = MultiplyByTen(tileSize);
tileJoint = MultiplyByTen(tileJoint);
}
tiles[tileCount]->size = (long long)tileSize;
printf("%lld\n", tiles[tileCount]->size);
tiles[tileCount]->joint = (long long)tileJoint;
if(++tileCount == *tileCap) {
DoubleArray(tiles, tileCap); //f() with realloc
}
} while(argc != EOF);
}
这个程序适用于输入的第一次迭代,但总是给出 exit code 11
并且调试器在赋值时说 BAD_ACCESS
。
所以我访问或分配数组的方式不正确。
我给了我的函数一个双指针。所以为了访问 Tile 成员,我需要取消引用它两次。一个取消引用是 []
,另一个是 ->
。分配后打印 Tile
确认。
而且我认为我的分配没有任何问题。我哪里错了?
编辑:tiles[index]->size
意味着 *(tiles[index]).size
而我需要 (*tiles)[index].size
。取消引用顺序和范围很重要。
尽管您的代码似乎不完整而且我主要是在猜测,但问题似乎出在您的 main
函数的以下行中:
GetInput(&minW, &minL, &tiles, &tileCap);
你应该认为 tiles
已经是一个指针了。当您使用 &tiles
时,您实际上是在将指针传递给指针而不是指针本身。
在您的 GetInput
函数中,您正在使用 tiles[tileCount]
,这表明您想要传递一个指针。如果你的 GetInput
应该得到一个双指针,你会使用 (*tiles)[tileCount]
.
你可以通过倾听解决其中的许多问题
我想你可能想做的是:
GetInput(&minW, &minL, tiles, &tileCap);
函数定义大概应该是这样的:
void GetInput(double *w, double *l, Tile *tiles, unsigned *tileCap
编辑:(使用双指针)
由于您需要使用双指针,因此您应该记得在查看数据时解除对双指针的引用。即:
*(tiles)[tileCount]->size = (long long)tileSize;
printf("%lld\n", *(tiles)[tileCount]->size);
*(tiles)[tileCount]->joint = (long long)tileJoint;
解释:
双指针需要双解引用。第一次解引用收集有关嵌套指针 (*tiles
) 的信息,第二次解引用收集数据 (**tiles
).
也可以使用方括号((*tiles)[i]
或 tiles[0][i]
)实现双重解引用。
由于 tiles
是 struct
,您也可以使用 "arrow" 作为第二种解引用技术:(*tiles)->size
我的 main
函数是这样的:
int main() {
//
double minW, minL, width, length;
unsigned tileCap = 10;
auto *tiles = (Tile*)calloc(tileCap, sizeof(Tile) );
GetInput(&minW, &minL, &tiles, &tileCap);
}
而我的 GetInput()
将读取并保存到 Tile
的数组中:
void GetInput(double *w, double *l, Tile **tiles, unsigned *tileCap) {
//
printf("Tile:\n");
double tileSize, tileJoint;
int argc;
unsigned tileCount = 0;
do {
argc = scanf("%lf %lf", &tileSize, &tileJoint);
if (tileSize == 0 || !CorrectSize(tileSize) || !CorrectSize(tileJoint) || argc != 2)
BadInput();
bool needTransform = HasFloatingPoint(tileSize);
if(needTransform) {
tileSize = MultiplyByTen(tileSize);
tileJoint = MultiplyByTen(tileJoint);
}
tiles[tileCount]->size = (long long)tileSize;
printf("%lld\n", tiles[tileCount]->size);
tiles[tileCount]->joint = (long long)tileJoint;
if(++tileCount == *tileCap) {
DoubleArray(tiles, tileCap); //f() with realloc
}
} while(argc != EOF);
}
这个程序适用于输入的第一次迭代,但总是给出 exit code 11
并且调试器在赋值时说 BAD_ACCESS
。
所以我访问或分配数组的方式不正确。
我给了我的函数一个双指针。所以为了访问 Tile 成员,我需要取消引用它两次。一个取消引用是 []
,另一个是 ->
。分配后打印 Tile
确认。
而且我认为我的分配没有任何问题。我哪里错了?
编辑:tiles[index]->size
意味着 *(tiles[index]).size
而我需要 (*tiles)[index].size
。取消引用顺序和范围很重要。
尽管您的代码似乎不完整而且我主要是在猜测,但问题似乎出在您的 main
函数的以下行中:
GetInput(&minW, &minL, &tiles, &tileCap);
你应该认为 tiles
已经是一个指针了。当您使用 &tiles
时,您实际上是在将指针传递给指针而不是指针本身。
在您的 GetInput
函数中,您正在使用 tiles[tileCount]
,这表明您想要传递一个指针。如果你的 GetInput
应该得到一个双指针,你会使用 (*tiles)[tileCount]
.
你可以通过倾听解决其中的许多问题
我想你可能想做的是:
GetInput(&minW, &minL, tiles, &tileCap);
函数定义大概应该是这样的:
void GetInput(double *w, double *l, Tile *tiles, unsigned *tileCap
编辑:(使用双指针)
由于您需要使用双指针,因此您应该记得在查看数据时解除对双指针的引用。即:
*(tiles)[tileCount]->size = (long long)tileSize;
printf("%lld\n", *(tiles)[tileCount]->size);
*(tiles)[tileCount]->joint = (long long)tileJoint;
解释:
双指针需要双解引用。第一次解引用收集有关嵌套指针 (*tiles
) 的信息,第二次解引用收集数据 (**tiles
).
也可以使用方括号((*tiles)[i]
或 tiles[0][i]
)实现双重解引用。
由于 tiles
是 struct
,您也可以使用 "arrow" 作为第二种解引用技术:(*tiles)->size