1

我的任务是使用 C 计算文件中有多少不同的单词。我已经在 J​​ava 中完成了相同的任务,但是在 C 中执行此操作时遇到了一些困难。我已经阅读了很多关于指针和数组以及如何初始化它们的内容在构造函数中,但我仍然不明白,这就是我寻求帮助的原因。

这就是我在 Java 中的做法:

public class DataSet {

private String[] elements;
private int top;

public DataSet() {
    elements = new String[1];
    top = 0;
}

现在我正在尝试在 C 中做同样的事情,这就是我的代码的样子:

我有两个类第一个 DataSet.h:

typedef struct _DataSet {
    char *elements;
    int top;
} DataSet;

第二个 DataSet.c

#include <stdlib.h>
#include <stdio.h>
#include "DataSet.h"   /*external libaray */

DataSet* createDataSet() 
{
  DataSet* d = malloc(sizeof(TextString));
  d -> elements = malloc(1 * sizeof(char));
  d -> top = 0;
  return d;
}

我有两个问题:

  1. 我的理解是否正确:我创建了一个对象 DataSet 以便能够使用变量,然后我将指针设置为这个称为元素的新数组,它可能包含一个字符串,然后我将顶部设置为 0,最后我返回目的。
  2. 如果不正确,我应该怎么做才能使其与我的 Java 代码完全相同?
4

2 回答 2

2

通常,如果您malloc使用类似 的结构DataSet,则应确保分配的大小与结构的大小相同。

你的线

DataSet* d = malloc(sizeof(TextString));

肯定是错误的,但如果 TextString 比 DataSet 大,可能会意外工作。你真的应该写:

DataSet* d = malloc(sizeof(DataSet));

如果你想像在 Java 代码中那样存储一个字符串数组,那么 DataSet 结构的这一行中的类型是错误的:

char *elements;

请记住,在 C 中,字符串是字符数组。所以字符串数组是字符数组的数组,如下所示:

char **elements;

此外,您不想像在行中那样为一个字符分配空间

d -> elements = malloc(1 * sizeof(char));

相反,您想为指向字符(字符串中的第一个字符)的指针分配空间。

d -> elements = malloc(1 * sizeof(char *));

请注意,这不会为字符本身分配任何内存!

于 2013-09-09T10:25:55.607 回答
0

你想为 DataSet 结构分配内存,所以这是:

DataSet* d = malloc(sizeof(struct _DataSet));

--

d -> elements = malloc(1 * sizeof(char));

在这里,您只需为一个字符分配内存,我认为您需要为字符串分配内存:

d -> elements = malloc(n * sizeof(char)); // where n is the max length of your string

希望这可以帮助

于 2013-09-09T10:26:09.047 回答