分段错误,无论我如何更改代码C ++

时间:2014-04-23 23:28:46

标签: c++ segmentation-fault

这是我的代码

#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <cstring>
#include <iostream>

using namespace std;

bool endsWith(string const &value, string const &ending)
{
    if(value.length() >= ending.length())
    {
        return (value.compare(value.length() - ending.length(), ending.length(), ending) == 0);
    }

    return false;
}

void listdir(const char *directory, const char *extension)
{
    DIR *dir;

    struct dirent *entry;

    if(!(dir = opendir(directory)))
    {
        return;
    }

    while(entry = readdir(dir))
    {
        if(entry->d_type == DT_DIR)
        {
            char path[1024];

            int len = snprintf(path, sizeof(path)-1, "%s/%s", directory, entry->d_name);

            path[len] = 0;

            if(strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0)
            {
                listdir(path, extension);
            }
        }
        else
        {
            string file = entry->d_name;

            if(endsWith(file, strcat((char *) ".", extension)) || extension == "*")
            {
                printf("%s \n", entry->d_name);
            }
        }
    }

    closedir(dir);
}

int main(int count, char *parameters[])
{
    const char *type = "*";
    const char *path = ".";

    if(count > 1)
    {
        path = parameters[1];
    }

    if(count > 2)
    {
        type = parameters[2];
    }

    if(count < 1 || count > 3)
    {
        return 0;
    }

    listdir(path, type);

    return 0;
}

无论如何,我在做什么,我总是会收到分段错误。

在debian下用g ++编译它没问题,但是运行应用程序总是会出现“Segmentation fault”

那是怎么回事?

1 个答案:

答案 0 :(得分:3)

您的错误位于行strcat((char *) ".", extension),您尝试将数据写入字符串文字底层的内存。

字符串文字被加载到只读内存段并尝试写入它会导致您的段错误。

如果您希望使用strcat,则必须提供足够大小的目标缓冲区(未进行检查,因此通常首选使用strncat)。由于此大小在编译时未确定,因此您必须计算要相互追加的两个字符串的长度,并使用newmalloc分配足够大小的缓冲区。

但是,在C ++中执行字符串连接的最简单方法是忘记C等价物的所有内容,并简单地使用::std::string,如下所示:

::std::string s = "hello ";
s += "world";