无法释放动态矩阵

标签 c matrix dynamic free

作为我的 C 作业的一部分,我必须创建一个函数,将字符串拆分为以插入的键(这是一个字母)开头的所有单词。 除了免费功能外,一切都很好, 当我尝试按函数释放动态矩阵时(行,然后是骨架) 我收到一个错误,表明程序已触发断点。

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

char **Split(char *str, char letter, int *size);
void free_mat(char **mat, int size);

int main() {
    int size, i;
    char letter;
    char STR[100];
    char **strings_arr;
    printf("Please enter a string:\n");
    flushall;
    gets(STR);
    printf("Please enter a letter for a check:\n");
    letter = getchar();
    strings_arr = Split(STR, letter, &size);

    if (size > 0) {
        printf("The number of words that starts with the letter '%c' in the string '%s' is: %d\n\n", letter, STR, size);
    }
    printf("The words are:\n");
    for (i = 0; i < size; i++) {
        printf("%d . %s\n", i+1,strings_arr[i]);
    }
    free_mat(strings_arr, size);
    return 0;
}

void free_mat(char **mat, int size)  
{
    int i;
    for (i = 0; i < size; i++)
    {
        free(mat[i]);
    }
    free(mat);
}
char **Split(char *str, char letter, int *size) {
    int rows = 0, i, lengh = 0, j = 0, n = 0, m;
    char **strings_array;

    if ((str[0] == letter) || (str[0] == letter + 32) || str[0] == letter - 32) {
        rows++; 
    }
    for (i = 0; str[i] != '\0'; i++) {
         if (str[i] == ' ') {   
            if ((str[i + 1] == letter) || (str[i + 1] == letter + 32) || str[i + 1] == letter - 32) {
                rows++; 
            }
        }
    }
    if (rows == 0) {    
        printf("There are no words starting with '%c' letter in this string\n\n", letter);
    }
    i = 0;
    strings_array = (char*)malloc(rows * sizeof(char)); 
    if ((str[0] == letter) || (str[0] == letter + 32) || str[0] == letter - 32) { 
        while (str[i] != ' ' && str[i] != '\0') {
            lengh++;
            i++;
        }
        strings_array[j] = (char*)malloc((lengh + 1) * sizeof(char)); 
        for (n = 0; n < lengh; n++) {
            strings_array[j][n] = str[n];
        }
        strings_array[j][n] = '\0';
        j++;    
    }
    for (i = 1; str[i] != '\0'; i++) {
            if (letter == str[i] || letter == str[i] - 32 || letter == str[i] + 32) {
                lengh = 0;
                //k = 0;
                m = i;  
                while (str[m] != ' ' && str[m] != '\0') {
                    lengh++;
                    m++;
                }
                strings_array[j] = (char*)malloc(lengh + 1);    

                for (n = 0; n < lengh; n++) {
                    strings_array[j][n] = str[i++]; 
                }
                strings_array[j][n] = '\0';
                j++;    
            }
    }
    *size = rows;   // sends back the number of words by referance
    return strings_array;
}

谢谢!

最佳答案

断点是您从 IDE 或等效工具手动插入到代码中的内容。它用于调试。当您运行代码时,它会在到达断点时停止。因此,只需删除断点,它就应该按预期工作。

注意:仅删除断点。不是该行的代码。

您在下面的评论中提到您正在使用 Visual Studio 2015。以下是该软件中断点的文档:https://learn.microsoft.com/en-us/visualstudio/debugger/using-breakpoints?view=vs-2019

但是您的代码还有一些其他内容。首先use fgets instead of gets 。其次,您似乎发布了错误的版本或其他内容,因为 free_mat 无法编译。不过,通过将 arr 更改为 mat 可以轻松解决这个问题。

还有 xing 在评论中提到的另一个错误。将 strings_array = (char*)malloc(rows * sizeof(char)) 更改为 strings_array = malloc(rows * sizeof(*strings_array))。强制转换不是必需的,您为 sizeof 的参数选择了错误的类型,并且如果您传递取消引用的指针而不是类型,您将来会避免很多问题。

关于无法释放动态矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56316565/

相关文章:

javascript - 向对象添加动态函数

pointers - C++ 偶尔动态指针崩溃

c - 不兼容的返回类型

c - 使用单循环数组中两个元素之间的最大差异

python - 更改 numpy 数组的格式而不使用循环

python - 在 python 中生成组合

两个向量之间的 OpenCV 欧氏距离

c++ - C++一次读取一个文件,无法输出内容

无法计算出 C 中指针的十六进制转换

c - POSIX:您如何确定您自己的进程的文件镜像以便您可以执行自己?