【问题标题】:Using an array of structures with call by reference通过引用调用使用结构数组
【发布时间】:2016-09-29 12:17:36
【问题描述】:

这是我的问题:我必须为学校制作这个程序,我花了最后一个小时进行调试和谷歌搜索,但没有找到答案。

我的main 中有一个结构数组,我想将该数组提供给我的函数seteverythingup(通过引用调用),因为在这个函数中,我从文件中读取的字符串被拆分,并且我想把它写到结构中,但是当 strcpy 使用结构数组时,我总是得到一个SIGSEV 错误。

这是我的主要内容:

int main(int argc, char *argv[])
{
FILE* datei;
int size = 10;
int used = 0;
char line[1000];
struct raeume *arr = (raeume *) malloc(size * sizeof(raeume*));
if(arr == NULL){
    return 0;
}
if(argc < 2){
    return 0;
}
datei = fopen(argv[1], "rt");
if(datei == NULL){
    return 0;
}
fgets(line,sizeof(line),datei);
while(fgets(line,sizeof(line),datei)){
        int l = strlen(line);
        if(line[l-1] == '\n'){
            line[l-1] = '\0';
        }
           seteverythingup(&line,arr,size,&used);

}
ausgabeunsortiert(arr,size);
fclose(datei);
return 0;
}

这是我的功能:

void seteverythingup(char line[],struct raeume *arr[], int size,int used)
{
    char *token,raumnummer[5],klasse[6];
    int tische = 0;
    const char c[2] = ";";
    int i=0;
    token = strtok(line, c);
    strcpy(raumnummer,token);
    while(token != NULL )
    {
        token = strtok(NULL, c);
        if(i==0){
            strcpy(klasse,token);
        }else if(i==1){
            sscanf(token,"%d",&tische);
        }
        i++;
    }
    managesize(&arr[size],&size,used);
    strcpy(arr[used]->number,raumnummer);
    strcpy(arr[used]->klasse,klasse);
    arr[used]->tische = tische;
    used++;
}

【问题讨论】:

  • 技术上C没有引用调用,只有值调用。您可以使用指向变量的指针模拟引用调用。
  • 至于你的问题,如果你的代码没有导致编译器给你错误或者警告,你需要开启更多的警告。
  • 你分配了一个指针数组,但指针指向的地方没有空间。
  • 这条线看起来有点可疑:struct raeume *arr = (raeume *) malloc(size * sizeof(raeume*)); raeume 是在哪里以及如何定义的?
  • 那就不要加指针的间接性了。将 malloc 更改为 size * sizeof(struct raeume) 并删除大部分 *。将语义更改为strcpy(arr[used].number, raumnummer)

标签: c structure pass-by-reference


【解决方案1】:

编辑:由于有更多的混乱,我编写了一个简短的程序来解决您遇到问题的部分。

#include <cstdlib>

struct raeume {
    int foo;
    int bar;
};

void seteverythingup(struct raeume *arr, size_t len) {
    for (size_t i = 0; i < len; ++i) {
        arr[i].foo = 42;
        arr[i].bar = 53;
    }
}

int main() {
    const size_t size = 10;
    struct raeume *arr = (struct raeume*) malloc(size * sizeof(struct raeume));

    seteverythingup(arr, size);

    return 0;
}

所以基本上你的函数的签名有点奇怪。 Malloc 会返回一个指向内存位置的指针。所以你真的不需要指向数组的指针。只需将您从 malloc 获得的指针传递给函数,该函数就可以操作该区域。

原答案:

malloc(size * sizeof(raeume*));

这可能是代码中让您感到困难的部分。 sizeof 返回类型的大小。您询问 sizeof 指向您的 raeume 结构的指针需要多少字节。您可能想要做的是询问结构本身的大小并为此分配大小乘以空间。所以对 malloc 的正确调用是:

malloc(size * sizeof(struct raeume));

【讨论】:

  • 非常感谢你刚刚解决了一个我什至不知道我做得很好的问题,但我仍然不明白为什么当我把它交给我的功能时它只是搞砸了。在我的 main 中它工作得很好,但在我的函数中它只是说:0xbaadf00d 当我查看数组的内存时
  • 好的,很好。自从您寻求更多帮助以来,我已经扩展了我的答案。请考虑将答案标记为已回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 2021-08-12
  • 2010-12-21
  • 1970-01-01
相关资源
最近更新 更多