Project.exe 已触发断点 (C)

Project.exe has triggered a breakpoint (C)

我是一名初级程序员,我接到了一项家庭作业,将一个字符串分成单词,并将每个单词放入一个字符串数组中。我们正在练习动态内存分配。作业说数组的大小必须是 [10],我需要根据字符串中的单词数使用 malloc 更改数组的大小,并为数组中的每个单词分配空间。当我到达程序末尾并释放分配的内存时,它说“Project.exe 已触发断点”,我找不到代码中的错误。

P.S 这是我关于堆栈的第一个问题,所以如果我以某种方式发布错误,我提前道歉。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void fillArray(char string[], char* array[], int* pointer);
int countCharacters(char string[], int index, int* pointer);
void freeArray(char* arr[], int size);


void main()
{
    char string[] = { "i have two dreams" };
    printf("Your sentence is: %s", string);
    int sentenceLength = 1;
    for (int i = 0; string[i] != '[=11=]'; i++)
    {
        if (string[i] == ' ') sentenceLength++;
    }
    int* point = &sentenceLength;
    char* array[10];
    fillArray(string, array, point);
    printf("\n\nYour array is: \n");
    for (int i = 0; i < *point; i++) puts(array[i]);
        freeArray(array, *point);
}


void fillArray(char string[], char* array[], int* pointer)
{
    *array = (char*)malloc(*pointer * sizeof(char));
    if (array == NULL)
    {
        printf("--NO MEMORY--");
        exit(1);
    }
    int i = 0;
    int j = 0;
    for (i; i < *pointer; i++)
    {
        array[i] = (char*)malloc(sizeof(char) * countCharacters(string, j, pointer));
        if (array[i] == NULL)
        {
            printf("--NO MEMORY--");
            exit(1);
        }
        for (j; string[j] != ' '; j++)
        {
            if (string[j] == '[=11=]')
            {
                array[i][j] = '[=11=]';
                return;
            }
            array[i][j] = string[j];
        }
        if (string[j] == ' ' || string[j] == '[=11=]')
        {
            array[i][j] = '[=11=]';
            j++;
        }
    }
}


int countCharacters(char string[], int index, int* pointer)
{
    int size = 1;
    if (string[index] == ' '&& index<= *pointer) index++;
    for (index; string[index] !=' '&& string[index]!='[=11=]'; index++)
    {
        size++;
    }
    return size;
}


void freeArray(char* arr[], int size)
{
    for (int i = 0; i < size; i++)
    {
        free(arr[i]);
        arr[i] = NULL;
    }
}

"作业说数组的大小必须是 [10],我需要根据字符串中的单词数用 malloc 更改数组的大小" ... ”它说“Project.exe 触发了一个断点”,我在代码中找不到我的错误。”

您的代码中可能还有其他问题,但根据评论,您表达的最大问题是分配和释放内存的问题。以下内容仅针对这些要点。

这条语句:

char* array[10];  

创建一个包含 10 个指向 char 的指针的数组。在上述作业参数的上下文中,这将限制您在任何给定句子中最多使用 10 个单词。这个事实似乎与你的陈述中所做的假设相冲突需要根据字数用malloc改变数组的大小。每个指针的动态分配将设置字符数。 (不是字数。)。因为有 10 个指针,所以最多可以调用 10 次 malloc(),您创建的每个指针调用 1 次。但是在你的设计中,你只会进行调用,因为你的句子中有单词,每个单词都有足够的内存来容纳每个单词

例如,“我有两个梦想”有 4 个单词,分别需要 2、5、4 和 7 个字节的内存(占空终止的额外字节。)这将需要调用 4 次 malloc,每个具有唯一的长度值。

(假设下面的 _length_values 是从您对 countCharacters(string, j, pointer) 的调用返回的,包括终止 null,下面将使用:length

请注意,在您的代码中,第一次调用 malloc 不是必需的:

*array = (char*)malloc(*pointer * sizeof(char));

并且在循环中 (for (i; i < *pointer; i++)) 调用 array[i] = (char*)malloc(sizeof(char) * countCharacters(string, j, pointer)); 应该被分成 2 个单独的调用以减少对 countCharacters:

的失败调用
in length = countCharacters(string, j, pointer);
if (length > 0)
{
     array[i] = malloc(length);//cast and sizeof(char) are removed
     ...   

根据您选择的句子:"i have two dreams",应该有 4 个调用,每个包含一个长度值,对应于您之前对 countCharacters

的调用
array[0] = malloc(length); //2
array[1] = malloc(length); //5
array[2] = malloc(length); //4
array[3] = malloc(length); //7

这将创建可表示为的内存:

相应地,对于之前对 malloc

的每次调用,都需要对 free 进行一次显式调用

根据以上,该段中应该有 4 个调用,但相应地索引:

for (int i = 0; i < *point; i++) puts(array[i])
                                               ^ removed ;
        freeArray(array[i]);
                       ^^^

使用 freeArray

的修改版本
   void freeArray(char* arr[])
   {
        free(arr[i]);
        arr[i] = NULL;
   }