C:数组元素消失

时间:2015-07-24 07:25:53

标签: c arrays

我在弄清楚为什么“myWord”数组中的元素正在消失时遇到了一些麻烦。 “myWord”和“myLines”都是我的.h文件中的全局变量。问题是,如果我将readWords()和printWords()函数结合起来,那么它就可以了。那么我用“myWord”来解决这个问题是怎么回事?

这是我的输出:

> Line: 0 (null) 
> Line: 1 (null) 
> Line: 2 ▒Á# 
> Line: 3 __libc_start_main
> Line: 4 (null) Segmentation fault (core dumped)

.c文件片段

void ReadWords(struct assem item)               //reads words into array    
{
    char *word;
    for(int s = 0; s < item.counter; s++)
            {
                item.word = strtok(item.myLines[s], " ");
                item.myWord[s] = item.word;
            }       
}

void printWords(struct assem item)
{
    for(int s = 0; s < item.counter; s++)
        {
            printf("Line: %i %s\n", s , item.myWord[s]);
        }
}

.h文件

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

struct assem
{
        char myString[101];                     //buffer
        char *myLines[20];                      //this will store the lines from a text file..up to 20 lines
        char *myWord[20];
        char *word;
        int counter;                            //counter for number of lines
                                                //printing stuff...prints file directly from whats STORED IN THE ARRAY

};

int readFile(FILE *FileToBeRead, struct assem *item);       //takes in the file that needs to be read and splits it into lines
void ReadWords(struct assem item);                          //stores the first word of each line in an array for evaluation
void printFile(struct assem item);                          //prints some stuff
int firstCheck(struct assem item);
void printWords(struct assem item);                                         //checks the first character if its instruction, label, or comment

1 个答案:

答案 0 :(得分:3)

您的函数ReadWords应该用数据填充结构。它的签名是:

void ReadWords(struct assem item);

这里,item是结构的本地副本,因为结构是按值传递的。函数返回后,对本地结构的所有更改都将丢失,并且原始结构将不会初始化。 (因此,您在打印时看到的垃圾值。)

您可以通过将指针传递给结构来解决此问题:

void ReadWords(struct assem *item) 
{
    item->word = ...;
}

并称之为:

struct assem item;

ReadWords(&item);

另一种可能性是让函数返回一个结构:

struct assem ReadWords()
{
     struct assem item;

     item.word = ...;
     // ...
     return item;
}

并将其称为:

struct assem item = ReadWord();

将结构按值传递给打印功能是可以的,因为您在打印时不会修改原始结构。如果结构很大,您也可以考虑将其作为const struct assem * const指针传递,以避免复制。 (返回一个结构有同样的问题,所以更喜欢指针。)

最后,我不认为您需要使用结构成员进行标记。解析后的item.word的含义应该是什么?