在当前阶段,下面是我的程序的未完成代码,但是,我遇到了错误(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;
}

最佳答案

除了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/

10-15 03:09