终端参数引起的分段错误

时间:2018-02-21 20:01:41

标签: c segmentation-fault command-line-arguments

我尝试从终端参数中获取可能是文件名的字符串。我想知道为什么会出现分段错误。

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

int main(char *argv[]){

    char somefile[sizeof(argv)];
    strncpy(somefile,argv[0],sizeof(argv));

    printf("The file name is: %s", somefile);

    return 0;
}

2 个答案:

答案 0 :(得分:2)

您的陈述:

strncpy(somefile,argv[0],sizeof(argv)); 

将指针的长度(即4或8)传递给第3个参数,而不是字符串的实际大小。将其更改为:

char somefile[strlen(argv[0])+1]; // note extra space for NULL terminator...
strncpy(somefile,argv[0],strlen(argv[0])+1); // ...here as well

注意,strncpy(dest, src, n)(例如)复制src指向的字符数组的大多数n个字符。如果在复制整个数组n之前达到src,则生成的字符数组dest不会以空值终止。为了减轻这种潜力,您可以考虑执行以下操作:

char src[] = "this string is too long";
char dest[10];
int n = 10;
strncpy (dest, src, n);

导致dest包含:

|t|h|i|s| |s|t|r|i|n|?|?|?|...// may, or may not have a null terminator somewhere.  

dest[n-1] = 0;

导致dest包含:

|t|h|i|s| |s|t|r|i|\0|?|?|?|...// guaranteed NULL termination.

由于somefile是根据argv[0]

专门创建的
strcpy(somefile,argv[0]);   
在这种情况下,

也会做得很好。

答案 1 :(得分:2)

要获得argv的长度,您可以改为class Temperature { private: ... //conversion tables static std::map<TempType, std::function<double(double)>> fromCelsius = ...; static std::map<TempType, std::function<double(double)>> fromFahrenheit = ...; ... and so on ... };

一切都有点像这个重大问题。 strlen(argv[0])应该使用字符串的长度,而不是看起来应该有效。