C中的动态内存分配:为什么会出现错误?

时间:2016-03-28 05:32:14

标签: c memory allocation

下面是我的程序的未完成代码,在当前阶段,但是,我收到错误(Xcode日志:Subscripted value is not array, pointer or vector)。我想它与内存分配有关。当我尝试将值1分配给(*map[x2][y2]).existmap[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;
}

1 个答案:

答案 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数组中该位置的指针。

您应该可以应用相同的规则进行映射,以使代码正常工作。