【问题标题】:Dynamic memory allocation in C: why do I get an error?C 中的动态内存分配:为什么会出现错误?
【发布时间】:2016-03-28 05:32:13
【问题描述】:

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

【问题讨论】:

  • 你猜错了。解释你打算(*map[x2][y2])做什么
  • @WhozCraig 我想将值 1 分配给 (*map[x2][y2])
  • @WhozCraig 我正在制作一个游戏,其中某个点应该穿过场地并避开障碍物
  • 请注意,我没有对那个问题进行赋值或赋值。表达式(*map[x2][y2]) 本身。而且您意识到您使用的标识符 map 与在 main() 中找到一个范围级别的标识符相同,对吗? name *map = ... 正在声明该 if 块范围的本地变量。 (并泄漏您在该过程中分配的内存)。仅供参考,x2y2 都不会在 if 测试之前使用任何确定的值进行初始化。
  • 不完全是泄漏 - 可能更糟糕的是,隐藏。在main()原始map之外的任何函数中都会神奇地重新出现.....

标签: c memory allocation


【解决方案1】:

除了 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] 访问 Guy 数组中该位置的指针。

您应该能够将相同的规则应用于映射以使您的代码正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 2013-01-12
    • 2018-06-02
    相关资源
    最近更新 更多