我正在做一个词汇培训项目,在那里你可以添加、练习、查看和改变你的词汇.对于英语中的每个单词(最多50个字符),我希望有一个瑞典翻译/定义(最多999个字符)和几个例句(最多10个,每个包含最多999个字符).为此,我使用了一个名为Word的 struct ,由于我需要多个单词,因此我创建了一个大小为100(最多100个单词)的文字array.这种方法运行得很好,直到我创建了一个函数,希望在其中声明一个新的WORD类型的临时数组(因为我将随机化顺序,并且我不希望第一个数组受到影响).我将大小设置为MaxSize(100),但随后整个程序终止.经过一些实验后,我发现当我将临时数组的大小设置为92时,程序可以工作,但如果我将其设置为93时,程序就不能工作.这是为什么?这是否与我的数组占用了太多内存有关?我对c编程非常陌生,因此一个简单的解释将是很棒的.代码如下:谢谢.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXWORDS 92
#define MAXEWORD 50
#define MAXSENTENCE 999
#define MAXNR 10


typedef struct {
    char eWord[MAXEWORD];
    char sWord[MAXSENTENCE];
    char sentence[MAXNR][MAXSENTENCE];
} Word;

void printEnglishWords(Word theWords[], int thePos) {
    for(int i=0; i<thePos; i++) {
        printf("%s, ", theWords[i].eWord);
    }
}

void shuffleWords(Word theWords[], int thePos) {
    Word wordTemplate[MAXWORDS];
    Word hold;

    for(int i=0; i<thePos; i++) {
        wordTemplate[i]=theWords[i];
    }


    for(int i=0; i<thePos; i++) {
        int index=rand()%thePos;
        hold=wordTemplate[i];
        wordTemplate[i]=wordTemplate[index];
        wordTemplate[index]=hold;
    }

    printf("\n");
    printEnglishWords(wordTemplate, thePos);  

}

int main(void) {

    srand((unsigned) time(NULL));
    Word myWords[MAXWORDS];
    int pos;
    
    myWords[0]=(Word){"Dog", "Hund", {"I own a dog"}};
    myWords[1]=(Word){"Cat", "Katt", {"I do not own a cat"}};
    myWords[2]=(Word){"Food", "Mat", {"I am hungry and I need some food"}};
    pos=3;

    printEnglishWords(myWords, pos);    //output is Dog, Cat, Food, 

    shuffleWords(myWords, pos);         //output is Food, Dog, Cat, 


   return 0;

}

当MAXWORDS为92时,输出写在上面.但是,当MAXWORDS为93时,只会写入"Dog,Cat,Food",并且shffleWords函数不起作用.

推荐答案

在没有更多信息的情况下很难说,但如果我没记错的话,您的数组在这里接近1MB.一次分配的内存太多了.这"可能"就是问题所在.但这样的东西非常依赖于体系 struct 和系统.

例如,C语言缺少Java提供的许多易于使用的功能.如果您不告诉C这样做,它将不会在heap上分配内存.

try 将数组放在堆上.导入stdlib.h并为您的数组分配专用内存.

不是:

Word myWords[MAXWORDS];

它看起来类似于:

Word *myWords;

myWords = malloc(MAXWORDS * sizeof(Word));
 

您还可以将shuffleWords()函数更改为:

void shuffleWords(Word *theWords, int thePos) {
    ...

}

现在,wordtemplate是指向堆内存的指针.wordtemplate[0]将获得第一个元素,wordtemplate[0].eWord[0]将获得 struct 中的array.您还可以使用指针数组和循环分别 for each struct 分配内存.

有很多好的资源可以告诉你,如果你在谷歌上搜索的话,如何go 做malloc.或者right here on stackoverflow.这是一个很好的做法,一旦您不再需要它,也可以分配free个内存.我认为在你的情况下没有这个必要.但是,如果您想用C编写更多的程序,我强烈建议您熟悉所有这些内容.


编辑:要拆分已分配的内存,您可以try 执行以下操作.

Word *myWords[MAXWORDS];
for(i = 0; i < MAXWORDS; i++)
  myWords[i] = malloc(sizeof(Word));

不过,这将改变您访问数组的方式.您甚至可以将指针数组放在堆中.但我猜你可能想让它简单些.

C++相关问答推荐

如何在C中的空指针函数中传递浮点值

如何通过Zephyr(Devicetree)在PR Pico上设置UTE 1?

了解一些CLIPS原语数据类型

在32位处理器上优化53—32位模计算>

如何将不同长度的位转换成字节数组?

如何将已分配的数组(运行时已知的大小)放入 struct 中?

特定闪存扇区的内存别名

如何在IF语句中正确使用0.0

如何在不使用其他数组或字符串的情况下交换字符串中的两个单词?

如何在c++中包装返回空*的函数

是否需要包括<;errno.h>;才能使用perror?

处理EPOLL_WAIT中的接收数据和连接关闭信号

用C++构建和使用DLL的困惑

通过k&;r语法的c声明无效

C";中的ANN运行时判断失败#2-变量outputLayer;周围的堆栈已损坏.运行后出错

错误:字符串在C中获得意外输出

在运行时判断C/C++指针是否指向只读内存(在Linux操作系统中)

如何在MSVC中使用intSafe.h函数?

变量值不正确的问题

既然我们在 if 中将 int 的值更改为 10,为什么在第二个 fork 后,子进程及其创建的子进程都会打印 33 ?