gpt4 book ai didi

c - memset 抛出段错误

转载 作者:行者123 更新时间:2023-11-30 15:53:33 27 4
gpt4 key购买 nike

我在编写一个函数来从文件中提取字符串作为更大程序的一部分时遇到一些问题。一切似乎都工作正常,除了当我使用 memset 或 bzero 来删除我一直在使用的字符数组时。我已经解决这个问题一个多小时了,无论我做什么,我都会遇到段错误。我在 bzero 和 memset 上都收到此错误。请帮帮我。我在下面附上我的代码。打印了语句“Come out of addfront”,但没有打印“Done with all bzero”语句。那时我遇到了段错误。谢谢

void extractFileData(FILE *fp , char clientName[])
{
char tempFileName[50], tempFilePath[100], tempFileSize[50];
struct stat fileDetails;

while(fgets(tempFileName, sizeof(tempFileName), fp)!= NULL)
{
if((newLinePos = strchr(tempFileName, '\n')) != NULL)
{
*newLinePos = '\0';
}

strcat(tempFilePath, "SharedFiles/");
strcat(tempFilePath, tempFileName);

if(stat(tempFilePath, &fileDetails) < 0)
{
perror("Stat error");
exit(1);
}

//Copy it into a string
sprintf(tempFileSize, "%zu", fileDetails.st_size);
printf("temp file size: %s\n", tempFileSize);

//Add all these details to the file list by creating a new node
addFront(tempFileName, tempFileSize, clientName);

printf("Come out of addfront\n");

memset(&tempFileName, 0, 45);
printf("Done with all bzero\n");
memset(&tempFileSize, 0, sizeof(tempFileSize));
memset(&tempFilePath, 0, sizeof(tempFilePath));

printf("Done with all bzero\n");
}
}

编辑:

void addFront(char fileName[], char fileSize[], char clientName[])
{
FILENODE* n;
printf("Inside add front function\n");
strcpy(n->fileName, fileName);
printf("n->filename: %s\n", n->fileName);
strcpy(n->fileSize, fileSize);
printf("n->filesize: %s\n", n->fileSize);
strcpy(n->ownerName, clientName);
printf("n->ownername: %s\n", n->ownerName);
myFileList.head = n;
printf("Did it go past myfilelist head = n\n");
myFileList.numOfNodes++;
printf("num of nodes: %d\n", myFileList.numOfNodes);
}

我已经添加了 addFront 函数的代码。它基本上添加了struct myFileList 的详细信息,它基本上是一个实现的链表。 FILENODE 代表列表中的每个条目。

编辑:

添加我正在使用的结构

 struct fileNode
{
char fileName[50];
char fileSize[50];
char ownerName[25];
struct fileNode* next;
};

struct fileList
{
struct fileNode* head;
struct fileNode* tail;
int numOfNodes;
};

typedef struct fileList FILELIST;
typedef struct fileNode FILENODE;

最佳答案

我不知道为什么你的程序会在那里崩溃。但我可以在程序中出现另一个错误。先修复其他错误,看看是否还有问题。

这是错误:

strcat(tempFilePath, "SharedFiles/");
strcat(tempFilePath, tempFileName);

tempFilePath 变量未初始化。这可能碰巧不会崩溃,但你不能指望它不会崩溃。它可能会在你的堆栈上乱写乱画。

这样做:

snprintf(tempFilePath, sizeof(tempFilePath), "SharedFiles/%s", tempFileName);

最后,不需要将数组归零。数组的内容不会在下一次循环迭代中使用,因此您不妨忽略它们。

void extractFileData(FILE *fp , char clientName[])
{
char tempFileName[50], tempFilePath[100], *newLinePos;
struct stat fileDetails;
while (fgets(tempFileName, sizeof(tempFileName), fp)) {
if ((newLinePos = strchr(tempFileName, '\n')))
*newLinePos = '\0';
snprintf(tempFilePath, sizeof(tempFilePath),
"SharedFiles/%s", tempFileName);
if (stat(tempFilePath, &fileDetails) < 0) {
perror("Stat error");
exit(1);
}
printf("temp file size: %zu\n", tempFileSize);
addFront(tempFileName, tempFileSize, clientName);
}
}

snprintf() 函数确实是在 C 中完成此类工作的第一选择。使用 snprintf() 编写“显然会赢”的代码很容易t crash”,而不是“不会明显崩溃”的代码。

如果您的代码仍然崩溃,则说明其他地方存在错误。

关于c - memset 抛出段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13557021/

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