通过将参数传递给函数来分割错误(C,linux上的代码块)

时间:2014-10-03 13:50:49

标签: c linux segmentation-fault codeblocks

为什么我一直得到"分段错误(核心转储)"通过运行这个?

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

int main(int argc, char *argv[])
{
    printf("%d", strlen(argc));

    return 0;
}

那是我的&#34; argc&#34;

gnome-terminal --disable-factory -t Es1 -x  /usr/bin/cb_console_runner LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. /.../Lab1/Es1/bin/Debug/Es1 Es1.cbp es1file.txt es1out.txt (in /.../Lab1/Es1/.)

4 个答案:

答案 0 :(得分:4)

size_t strlen(const char *str)

strlen()函数接受一个指向字符串的指针。你正在传递一个整数。

答案 1 :(得分:3)

因为argc不是字符串,所以它是整数值。名称argc代表&#34;参数计数&#34;,并告诉您argv数组中的条目数。

使用argc作为指向字符串的指针会导致undefined behavior,这通常会导致崩溃。实际上,使用任何不是指向字符串的指针作为函数的参数,该函数需要指向字符串的指针将导致未定义的行为。

你没有收到警告吗?然后,您需要在编译时启用更多警告!你应该得到一个警告,告诉你你是&#34;从整数做出一个没有强制转换的指针&#34; (或类似的东西)。

答案 2 :(得分:0)

argcint eger,但strlen()需要指向字符串(char *)的指针,这就是您获得分段错误的原因。< / p>

答案 3 :(得分:0)

1°)strlen,正如其名称明确指出的那样,为您提供字符串的长度。在这里,你试图在int:argc上使用它。 (它给出了参数数组argv的长度)。

在C中,字符串是以“\ 0”字符终止的字符数组。如果在这样的数组上使用,Strlen将只能安全地工作(如果数组没有“\ 0”结束字符,你将得到相同的错误。)

2°)如果要显示参数个数,只需使用argc(如“参数计数”)减1(因为程序名称将是第一个参数)。

3°)如果要显示一个参数的长度,则需要指定参数然后使用strlen。例如。 :

if (argc > 1) {
   printf("%d", strlen(argv[1]));
}