无法获得段错误的原因

时间:2019-05-07 07:09:55

标签: c malloc dynamic-arrays

EDIT:请注意,如果您是这样的话,并不是说我无法访问storeContents()main()分配的内存。 storeContents()

执行期间程序崩溃

程序在这里失败:

strcpy(contents[count], dir->d_name);
printf("Stored %s(out hiddenVisible)\n", dir->d_name); // for testing

它是strcpy()而不是printf(),我添加它只是为了参考。

调试器(gdb)说:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7f3cd72 in __strcpy_ssse3 () from /usr/lib/libc.so.6

我正在制作一个包含以下功能“ storeContents”的程序(它将目录的内容名称存储在动态数组中)。此功能有两个问题:(1)对第一个文件说两次存储的文件名 ,以及(2)说出“ < strong>分段错误”。我不知道他们两个。感谢您的努力!

#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <stdlib.h>
#include <sys/types.h>
#include <limits.h>

static short hiddenVisible = 0;

/* Store directory's contents in **contents */
static char ** storeContents(struct dirent *dir, DIR *dirp, unsigned numOfContents);
/* Count files/directories in a directory */
static unsigned getNumOfContents(struct dirent *dir, DIR *dirp);

int main(int argc, char const *argv[])
{
    char **contents;
    DIR *dirp;
    struct dirent *dir;
    unsigned numOfContents;

    dirp = opendir("/home/gaurav");
    if((dir = readdir(dirp)) == NULL) {
        perror("readdir");
        exit(1);
    }

    /* Getting number of files/directories */
    numOfContents = getNumOfContents(dir, dirp);
    printf("There are %u files.\n", numOfContents);

    /* To position again to the first entry */
    rewinddir(dirp);

    contents = storeContents(dir, dirp, numOfContents);

    /* Print contents */
    for(unsigned i = 0; i < numOfContents; ++i)
        printf("%s\n", contents[i]);

    closedir(dirp);
    return 0;
}

char **
storeContents(struct dirent *dir, DIR *dirp, unsigned numOfContents) {

    char **contents;
    unsigned count = 0;

    /* Allocating memory for entries */
    contents = malloc(numOfContents * sizeof(*contents));

    /* Allocating memory for each '*contents' */
    for(unsigned i = 0; i < numOfContents; i++)
        contents[i] = (char *)malloc(NAME_MAX); /* we know char is 1 byte, so no "sizeof" */

    while(count < numOfContents) {
        /* Ignore "." and ".." */
        if(!(strcmp(dir->d_name, ".")) || !(strcmp(dir->d_name, ".."))) {
            if((dir = readdir(dirp)) == NULL) {
                perror("readdir");
                exit(1);
            }
            continue;
        }

        if(hiddenVisible) {
            strcpy(contents[count], dir->d_name);
            if((dir = readdir(dirp)) == NULL) {
                perror("readdir");
                exit(1);
            }
            count++;
        } else {
            if(dir->d_name[0] == '.')
                if((dir = readdir(dirp)) == NULL) {
                    perror("readdir");
                    exit(1);
                }
                else {
                    strcpy(contents[count], dir->d_name);
                    if((dir = readdir(dirp)) == NULL) {
                        perror("readdir");
                        exit(1);
                    }
                    count++;
                }
        }
    }
    return contents;
}

unsigned
getNumOfContents(struct dirent *dir, DIR *dirp) {

    unsigned count = 0;

    while(dir) {
        if(hiddenVisible) {
            /* Ignore "." and ".." */
            if(!(strcmp(dir->d_name, ".")) || !(strcmp(dir->d_name, ".."))) {
                if((dir = readdir(dirp)) == NULL) {
                    perror("readdir a");
                    exit(1);
                }
                continue;
            }
            count++;
            if((dir = readdir(dirp)) == NULL) {
                perror("readdir b");
                exit(1);
            }
        } else {
            if(dir->d_name[0] == '.') {
                if((dir = readdir(dirp)) == NULL) {
                    perror("readdir c");
                    exit(1);
                }
            }
                else {
                    count++;
                    if((dir = readdir(dirp)) == NULL) {
                        perror("readdir d");
                        exit(1);
                    }
                }
        }
    }

    return count;
}

2 个答案:

答案 0 :(得分:1)

一些错误:

  • contents是函数的局部参数,它将不会返回给main()。参见Dynamic memory access only works inside function
  • contents = (char **)malloc(numOfContents);是错误的,您需要为numOfContents指针分配空间。将其更改为contents = malloc(numOfContents * sizeof(*contents))
  • 您应检查对readdir的每次调用,并确保它不返回NULL

答案 1 :(得分:0)

函数kubectl get cm istio-sidecar-injector -n istio-system -o yaml | sed -e "s/rewriteAppHTTPProbe: false/grewriteAppHTTPProbe: true/g" | kubectl apply -f - master $ cat testfile initialDelaySeconds: [[ annotation .ObjectMeta `readiness.status.sidecar.istio.io/initialDelaySeconds` 1]] sed -i '/initialDelaySeconds:/c\initialDelaySeconds: 10' testfile master $ cat testfile initialDelaySeconds: 10 中的

contentsstoreContentscontents的本地副本。

在函数中更改它不会更改main中的变量。

您应该返回数组。变更
main

static void storeContents(struct dirent *dir, DIR *dirp, char **contents, unsigned numOfContents);

static char **storeContents(struct dirent *dir, DIR *dirp, unsigned numOfContents);在函数中,然后像return contents;

一样调用它
相关问题