gpt4 book ai didi

C 段错误 : memory altered between functions strcmp

转载 作者:太空宇宙 更新时间:2023-11-04 08:04:51 27 4
gpt4 key购买 nike

如果有人能告诉我为什么在 populate() 返回 dir 后我无法访问 dir.paths[dir.npaths] 中的内存,以及如何修复它。将不胜感激。

这是问题的简化,它浓缩了所有核心元素。我只需要知道如何在不出现段错误的情况下进行比较。

比较实际上用在 if 语句中。例如。如果(strcmp(目录...,"file")== 0)

Seek,在完整程序中,调用populate,变成了递归调用。这意味着我不能只将 strcmp 移动到填充函数中。他们需要分开。

//测试从函数 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;

//原型(prototype)

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

最佳答案

dir.paths[dir.npaths] = newPath;

愚蠢的问题,但是你是否在某处为 dir.paths[] 分配了内存?如果没有,您必须调用 dir.paths = calloc (count, sizeof(path))malloc (count * sizeof(path)) 具有相同的效果。

就像@code_farmer 指出的那样,您将 dir 中包含的数据按值传递给 populate,然后数据被复制到堆栈。当然,没有人负责将栈上数据复制回来。没有人应该。您必须按照@code_farmer 的建议调用populate。我什至建议您在将结构作为参数传递时使用指针,以减少内存占用,让您在这种情况下生活更轻松。

第一个

关于C 段错误 : memory altered between functions strcmp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43566423/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com