分段故障(内核已转储)-argv-c

问题描述 投票:0回答:3

我正在尝试为程序打开一个txt文件,输入该文件的名称作为命令行参数。如果我将路径作为字符串提供,那么它可以工作,因此我的代码中的问题出在命令行参数上。我有以下内容:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char* argv[])
{
    char* filename = "/path/";
    char* name = argv[1];
    printf("%s\n", filename);
    printf("%s\n", name);
    strcat(filename, name);
    printf("%s\n", filename);
    strcat(filename, ".txt");
    printf("%s\n", filename);
    return 0;
}

我这样运行:

./program filenamewithoutextension

运行时得到以下输出:

/path/
filenamewithoutextension
Segmentation fault (core dumped)

我不知道发生了什么。

c segmentation-fault argv coredump
3个回答
0
投票

请注意,在代码段中,filenamename只是指向只读数据的指针,因此您无法修改它们指向的数据。

您可以使用malloc动态分配内存,以便能够编辑它们指向的数据。或仅在堆栈中为它们分配内存,例如filename[100]name[100]

您的代码应为:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char* argv[])
{
    char filename[100]; 
    char name[100];
    strcpy(filename, "/path/");
    strcpy(name, argv[1]);
    printf("%s\n", filename);
    printf("%s\n", name);
    strcat(filename, name);//You can safely modify name now 
    printf("%s\n", filename);
    strcat(filename, ".txt");//You can safely modify filename now 
    printf("%s\n", filename);
    return 0;
}

0
投票

char* filename = "/path/";仍然被C接受以考虑编写的旧代码在早期,const关键字尚不存在。但这应该是const char *,因为这里的"/path/"实际上是一个常数串。(-Wwrite-strings编译器选项可以帮助检测到此问题)

如果要在此字符串后附加内容,则需要更多存储空间跟随字符。char filename[100]="/path/";在这种情况下,100个字符对于您的函数而言是本地的,可以更改。它们以给定的字符开头,但后跟许多零(最多100个)。

然后,在最后一个/之后放置一些新字符是有意义的。


-2
投票

strcat(filename, name);失败,因为filename变量的大小不足以容纳name变量。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char* argv[])
{
    char* filename = "/path/";
    char* name = argv[1];
    char *temp = (char *)malloc(sizeof(char)*(strlen(filename) + strlen(path) + 6));
    temp = filename;
    printf("%s\n", filename);
    printf("%s\n", name);
    strcat(temp, name);
    printf("%s\n", temp);
    strcat(temp, ".txt");
    printf("%s\n", temp);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.