C分段错误:strcmp

时间:2017-04-23 01:19:07

标签: c function recursion struct cs50

如果有人能告诉我为什么在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

2 个答案:

答案 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