在当前阶段,下面是我的程序的未完成代码,但是,我遇到了错误(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;
}
最佳答案
除了x2和y2没有定义的值-它们没有默认为0,并且if语句中的map变量将地图隐藏在if语句之外,您似乎在理解如何分配内存以及访问方面遇到问题分配之后。
我建议先修复Guy变量,然后再利用经验将其应用于map变量。
您编写的guy变量指向一个内存块,该内存块可以容纳10个名称结构。这并不意味着那里有10个名称结构,而是意味着它是一个足以容纳10个名称结构的内存块。请注意,该块的大小不能容纳10个指向名称结构的指针,而是10个实际名称结构。
当对诸如(guy+o)
的Guy变量进行算术运算时,您不会将o
名称结构移入内存块,因为Guy具有指向名称的大小指针,而不是名称的大小。如果系统上的指针大小为4个字节,并且名称结构的大小可能为8个字节,则您没有将正确数量的字节移入块中,因此未将指针指向正确的位置。
如果要初始化Guy中的10个名称,请帮自己一个忙,直到您对指针真的好为止-将guy变量创建为名称指针数组。
所以家伙的定义变成
name* guy[10];
并在Guy中初始化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]
即可访问盖伊数组中该位置的指针。您应该能够应用相同的规则进行映射,以使代码正常工作。
关于c - C中的动态内存分配:为什么会出现错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36256555/