下面是我的程序的未完成代码,在当前阶段,但是,我收到错误(Xcode日志:Subscripted value is not array, pointer or vector
)。我想它与内存分配有关。当我尝试将值1分配给(*map[x2][y2]).exist
和map[x1][y1] = NULL;
时,if语句中会出现此错误。能否请您展示为这些变量赋值的正确方法。
提前谢谢!
#include <stdio.h>
#include <stdlib.h>
typedef struct{
int num;
_Bool exist;
}name;
int main(void){
name* map[10][10];
name* guy;
guy = (name*)malloc(10*sizeof(name));
int x1, y1, x2, y2;
int m, n, o;
for(m = 0; m < 10; m++){
for(n = 0; n < 10; n++){
map[m][n] = NULL;
}
}
for(o = 0; o < 10; o++){
(*(guy+o)).num = rand() % 4;
(*(guy+o)).exist = 1;
do{
m = rand() % 10;
n = rand() % 10;
}while (map[m][n] != NULL);
map[m][n] = guy + o;
}
if(map[x2][y2] == NULL){
name *map = malloc(10*10*sizeof(name));
(*map[x2][y2]).exist = 1;
map[x1][y1] = NULL;
}
return 0;
}
答案 0 :(得分:0)
除了x2和y2没有定义的值 - 它们不默认为0,if语句中的map变量将地图隐藏在if语句之外,你似乎在理解如何分配内存方面遇到了问题以及在分配后访问它。
我建议首先修复guy变量,然后使用该经验应用于map变量。
你编写的guy变量指向一个可以容纳10个名称结构的内存块。这并不意味着那里有10个名称结构,它只是意味着它是一个足以容纳10个名称结构的内存块。请注意,块的大小不能容纳10个指向名称结构的指针,而是包含10个实际名称结构。
当您对像(guy+o)
之类的man变量进行算术运算时,您没有将o
名称结构移动到内存块中,因为guy的大小是指向name的大小,而不是name的大小。如果系统上的指针大小为4个字节,并且名称结构的大小可能是8个字节,那么您不会将正确的字节数移动到块中,因此您没有指向正确的位置。
如果你想在man中初始化10个名字然后帮自己一个忙,直到你真的很好用指针 - 将man变量创建为一个名字指针数组。
所以这个人的定义变成了
name* guy[10];
并且在man中初始化了10个名字
for ( m = 0; m < 10; m++ ) {
guy[m] = malloc( sizeof( name ) );
if ( guy[m] ) {
guy[m]->num = rand() % 4;
guy[m]->exist = 1;
}
}
而不是
guy = (name*)malloc(10*sizeof(name));
由于guy现在将被识别为指向名称指针数组的指针,当你像(guy + o)
这样算术时,它将使用指向不同名称结构的指针。但我会避免这样做,让你的生活更轻松。只需使用guy[o]
来访问guy数组中该位置的指针。
您应该可以应用相同的规则进行映射,以使代码正常工作。