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;
}
我是一名初级程序员,我接到了一项家庭作业,将一个字符串分成单词,并将每个单词放入一个字符串数组中。我们正在练习动态内存分配。作业说数组的大小必须是 [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;
}