如果有人能告诉我为什么在populate()返回dir之后我无法在dir.paths [dir.npaths]访问内存,以及如何修复它。非常感谢。
这是问题的简化,它与所有核心要素紧密结合。我只需要知道如何在不出现分段错误的情况下进行比较。
比较实际上是在if语句中使用的。例如。 if(strcmp(dir ...," file")== 0)
在完整程序中查找,调用populate并成为递归调用。意思是我不能将strcmp移动到populate函数中。他们需要分开。
//测试从函数populate
开始// seek()函数中的strcmp导致分段错误
#include <cs50.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
string name;
string type;
}
path;
typedef struct
{
int npaths;
path* paths;
}
directory;
//原型
int seek(directory dir);
int main(void)
{
directory dir;
seek(dir);
}
//实际测试低于此行
directory populate(directory dir)
{
path newPath = {.name = "file/", .type = "directory"};
dir.paths[dir.npaths] = newPath;
return dir;
}
int seek(directory dir)
{
populate(dir);
printf("Should return 0\n");
// Supposedly accesses memory it shouldn't
printf("%i\n", strcmp(dir.paths[dir.npaths].type, "directory"));
return 0;
}
//如果你很酷,想要浏览实际的代码,谢谢。
//这里是一个指向pastebin的链接。 https://pastebin.com/j8y652GD
答案 0 :(得分:1)
dir = populate(dir);
也许可以解决你的问题。
如果在行populate(dir)
中设置断点,则在执行此行后您将看到dir保持不变。
因为您的功能填充的参数类型为 struct ,传入填充的内容恰好是dir的副本。
答案 1 :(得分:1)
dir.paths [dir.npaths] = newPath;
愚蠢的问题,但你在某处为dir.paths[]
分配内存吗?如果没有,您必须以相同的效果致电dir.paths = calloc (count, sizeof(path))
或malloc (count * sizeof(path))
。
与@code_farmer一样,您可以按值将dir
中包含的数据传递给populate
,并将数据复制到堆栈中。当然,没有人负责复制堆栈数据。没人应该。您必须像@code_farmer建议的那样调用populate
。我甚至建议你在将结构作为参数传递时使用指针来减少内存占用,并使你在这样的情况下更轻松。
HTH