【问题标题】:expected ‘char ** restrict’ but argument is of type ‘char (*)[x]’预期为“char ** restrict”,但参数的类型为“char (*)[x]”
【发布时间】:2019-12-04 03:06:28
【问题描述】:

我从来没有理解过这个错误,而且我一直遇到类似的错误,这真的很令人沮丧,因为我找不到解决方案。 (如果有其他的请不要因为我找不到它而抨击我)。

看一段简单的代码:

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

int main(int argc,char *argv[]){
    char s[10];
    int x = strtol(argv[1], &s, 10);
    printf("%d", x);
    printf("%s", s);
    return 0;
}

我不断收到这些错误,但我真的不明白为什么:

警告:从不兼容的指针类型 [-Wincompatible-pointer-types] 传递“strtol”的参数 2 int x = strtol(argv[1], &s, 10);

注意:预期为“char ** restrict”,但参数类型为“char (*)[10]”

当我将 char s[10] 更改为 char *s 时,我在使用 strtol 的行上收到一个段错误。我不明白出了什么问题,有人可以解释一下吗?提前致谢。

【问题讨论】:

    标签: c


    【解决方案1】:

    您需要创建一个变量char *,然后将其传递给函数。 无法以这种方式传递数组,因为它不会衰减到 char **

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc,char *argv[]){
        char s[10];
        char* s_ptr; //New variable, char *
    
        int x = strtol(argv[1], &s_ptr, 10);
        printf("%d", x);
        printf("%s", s_ptr);
        return 0;
    }
    

    查看strtol函数的文档: http://www.cplusplus.com/reference/cstdlib/strtol/

    【讨论】:

    • 嗯,这似乎仍然导致了段错误。
    • 所以是时候调试它发生的地方了。它发生在strtol函数中,不是因为s_ptr指针。
    【解决方案2】:

    char s[10] 更改为char *s 是解决编译错误的正确方法。 strtol 的第二个参数应该是一个指向指针变量的指针,它将初始化为指向作为其第一个参数的字符串的某处。 char s[10] 不声明指针变量,char *s 声明。

    我能想到的唯一解释,为什么这个程序可能会崩溃,是你没有给它传递任何参数。在这种情况下,argc 将小于 2,argv[1] 将是一个空指针(或者甚至可能没有初始化)。你需要做这样的事情:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc,char *argv[])
    {
        if (argc != 2) {
            fprintf(stderr, "usage: %s integer\n", argv[0]);
            return 1;
        }
    
        char *s;
        long x = strtol(argv[1], &s, 10);
        printf("x: %ld\n", x);
        printf("s: '%s'\n", s);
        return 0;
    }
    

    顺便说一句,在 C 中,出于历史原因,首选的样式是将函数定义的左大括号放在自己的行上,即使所有其他左大括号都被“拥抱”了。

    【讨论】:

      【解决方案3】:

      &s 指的是数组的地址。它实际上是一个指向指针的指针。你想要的是传入数组名 s,它是一个指向数组 s 的第一个字符的指针。

      #include <stdio.h>
      #include <stdlib.h>
      
      int main(int argc,char *argv[]){
          char s[10];
          int x = strtol(argv[1], s, 10);
          printf("%d", x);
          printf("%s", s);
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-31
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 2016-11-01
        • 1970-01-01
        相关资源
        最近更新 更多