繁体   English   中英

memset投掷分割错误

[英]memset throwing segmentation fault

我在编写函数以从文件中提取字符串作为较大程序的一部分时遇到了一些问题。 除了使用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函数添加了代码。 它基本上将详细信息添加到结构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()编写“显然不会崩溃”的代码很容易,而不是“不会明显崩溃”的代码。

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

在执行任何操作之前, addFront()需要一个n = malloc( sizeof *n)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM