【问题标题】:Segmentation fault by passing arguments to a function (C, codeblocks on linux)通过将参数传递给函数的分段错误(C,Linux上的代码块)
【发布时间】:2014-10-03 13:50:48
【问题描述】:

为什么我通过运行这个程序总是得到“分段错误(核心转储)”?

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

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

    return 0;
}

那是我的“argc”

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/.)

【问题讨论】:

  • argc 是一个整数,而不是指向字符串的指针。
  • 在发布问题之前尝试做一些工作并尝试解决自己。这很简单,因为 90% 的开发人员都知道 strlen() 与字符串长度有关,与整数无关。

标签: c linux segmentation-fault codeblocks


【解决方案1】:
size_t strlen(const char *str)

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

【讨论】:

    【解决方案2】:

    这是因为argc 不是字符串,而是一个整数 值。名称argc 代表“参数计数”,它告诉您argv 数组中的条目数。

    使用argc 作为指向字符串的指针会导致undefined behavior,这通常会导致崩溃。确实,使用不是指向字符串的指针的 anything 作为期望指向字符串的指针的函数的参数将导致未定义的行为。

    你没有收到警告吗?那么你需要在编译时启用更多的警告!你应该得到一个警告,告诉你你正在“从没有强制转换的整数中创建一个指针”(或类似的东西)。

    【讨论】:

      【解决方案3】:

      argcinteger,但 strlen() 需要一个指向字符串 (char *) 的指针,这就是您得到分段错误的原因。

      【讨论】:

        【解决方案4】:

        1°) strlen,顾名思义,给出了字符串的长度。在这里,您尝试在 int 上使用它:argc。 (它为您提供参数数组 argv 的长度)。

        在 C 中,字符串是以“\0”字符结尾的字符数组。只有在这样的数组上使用 Strlen 才能安全工作(如果数组没有“\0”结尾字符,您会得到同样的错误)。

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-04-09
          • 1970-01-01
          • 1970-01-01
          • 2021-02-20
          • 2011-12-08
          • 1970-01-01
          • 2012-04-12
          相关资源
          最近更新 更多