“访问冲突写入位置0x00000000457E8770”在C中使用malloc

时间:2017-11-04 09:33:05

标签: c malloc

我有上面的错误,我会尽量清楚。

简短说明:

我定义了一个新的结构: kid ,我想在内存中为一个类型为kid的新数组分配空间。 所以我正在做malloc(通过我的检查 - >没有失败)并试图写入其中一个字段,如果数组,但我得到标题中的错误。 我不明白为什么我不能写这些字段,即使我做了动态分配。

包含评论的代码:

我定义了一个名为kid的结构如下:

 typedef struct
 {
     char name[16];
     candy *kid_candy;
 } kid;

(糖果是我定义的另一个结构,我不需要它复制他的定义)

上面的定义写在下面代码中包含的h文件中。

#include "kindergarten.h"
void AllocateKidsArray(int size);

int main()
{
    AllocateKidsArray(3);
}

void AllocateKidsArray(int size){

     kid *p_kids_arr = NULL;
     int i ;
     char blank[16] = {' '};

//In the next line want to allocate space for an array,that his type is kid:
     p_kids_arr = (kid*)malloc(size * sizeof(kid));

//  checking if allocation failed
     if (p_kids_arr == NULL)
     {
         return -1;
     }
     else
     {
         for (i = 0; i < size; i++)
         {

//now im trying to change a field in the array I allocated before:
             (p_kids_arr + sizeof(kid)*i)->kid_candy = NULL;
//but I always get the error from the title
         }

    }
}

要点:

当我在网上寻找一个解决方案时,大多数有这个错误的人,因为他们声明了一个指针,然后尝试写入它们。 但在我的情况下,我在哪里做malloc,我只是无法弄清楚问题是什么,这是令人不安的,因为它看起来像是一些基本的东西。

对我来说理解错过的是什么以及我做错了什么非常重要,我不想要任何代码修复,我想要的是理解为什么我无法写入动态分配的字段,这就是我需要你的原因帮助

谢谢!

1 个答案:

答案 0 :(得分:1)

为什么不替换这个

      (p_kids_arr + sizeof(kid)*i)->kid_candy = NULL;

用这个:

      p_kids_arr[i].kid_candy = NULL;

上述两个不一样。因为如果我实际上由于指针运算而将{1}的类型添加到int的指针,你将向它添加4个字节(如果int指针的大小是4个字节)(所以我认为第一个版本会增加更多的字节到{ {1}}超过需要。)

同样如评论中所述,您似乎缺少p_kids_arr

并且您应该收到警告,因为您在返回类型为#include <stdlib.h>的函数中执行了return -1;