释放字符数组中的指针后,C 程序崩溃 *

P. *_*ich 2 c arrays pointers

我是一名学习 C 的学生,我一直在使用字符串数组和 malloc()。

我有以下代码,它应该使用动态创建的字符串加载一个字符串数组(静态创建的)(如果我的术语与我拥有的代码不一致,请原谅/纠正我)。

问题是,一旦我释放该内存,就会出现以下错误: free(): invalid pointer

这是代码:

#include <stdio.h>
#include <stdlib.h>

#define RAM_SIZE 5

char* ram [RAM_SIZE];
int next_free_cell = 0;

void freeAndNullRam(){
    for (int i = 0 ; i < RAM_SIZE ; i++){
      printf("%d\n", i);
        free(ram[i]);
        ram[i] = NULL;
    }
}

int main(int argc, const char *argv[])
{
  for (int i= 0; i < RAM_SIZE; i++){
    ram[i] = (char*)malloc(sizeof(char*)*5);
    ram[i] = "aaaa";
  } 
  for (int i= 0; i < RAM_SIZE; i++){
    int empty = (ram[i] ==NULL);
    if(!empty){
      printf("%s\n", ram[i]);
    }
      
  }
  freeAndNullRam();
  for (int i= 0; i < RAM_SIZE; i++){
    int empty = (ram[i] ==NULL);
    printf("%d\n", empty);
  } 
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道问题肯定出在freeAndNullRam()函数中(显然),但我不明白为什么。我的理解是,在编译时,会创建一个包含 5 个指向 char 数组的指针的数组,但要实际填充数组的单元格,我需要给malloc它们一些内存。为什么当我释放数组中的指针时程序会抱怨,而当我给它们内存时却不会?

谢谢!

Oka*_*Oka 5

ram[i] = "aaaa";将指针重新分配a[i]到指向静态内存,丢弃malloc. 稍后您将这些指针传递给free,这将失败,因为它们不是*alloc函数的结果。

用于strcpy将字符串从静态内存复制到您分配的目的地。

strcpy(a[i], "aaaa")
Run Code Online (Sandbox Code Playgroud)