"分段错误(核心转储)"使用函数和指针

时间:2018-03-27 03:06:53

标签: c pointers

我正在学习c中的功能,并且有如此多警告的以下问题:-( 对不起,如果它太傻了。我正在学习它。

代码如下

#include <stdio.h>
void main(){
    int a,c;    
    char *b;    // declaring a pointer 
    char string[100]="something";
    b = string;     // assigning a pointer.. doing
    printf("\n %s \n\n %s",string,*b); // doing this as a verification of the pointer, which is good - no seg faults 
    printf("Enter a and c:-");  
    scanf("%d %d",&a,&c);
    find(a,c,*b);
    printf("%s",*b);//segementation fault core dumped:-'(
}
void find(int x, int y,char  *b){
    if(x>y)
        *b = "a is greater than b";
    else if(x=y)
        *b = "both the values are equal";
    else
        *b = "b is greater than a";
}
编译时

警告: -

function.c: In function ‘main’:
function.c:7:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Wformat=]
  printf("\n %s \n\n %s",string,*b); /*doing this jus to check is pointer working but no it is           *not.segmentation error here "core dumped":-'( 
  ^
function.c:12:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
  printf("%s",*b);//segementation fault core dumped:-'(
  ^
function.c: At top level:
function.c:14:6: warning: conflicting types for ‘find’ [enabled by default]
 void find(int x, int y,char  *b){
      ^
function.c:11:2: note: previous implicit declaration of ‘find’ was here
  find(a,c,*b);
  ^
function.c: In function ‘find’:
function.c:16:6: warning: assignment makes integer from pointer without a cast [enabled by default]
   *b = "a is greater than b";
      ^
function.c:18:6: warning: assignment makes integer from pointer without a cast [enabled by default]
   *b = "both the values are equal";
      ^
function.c:20:6: warning: assignment makes integer from pointer without a cast [enabled by default]
   *b = "b is greater than a";
跑步时

  • 分段错误(核心转储)

提前致谢: - )

工作鳕鱼:= ----在社区的帮助下

#include <stdio.h>
#include <malloc.h>
void main(){
    int a,c;    
    char *b =(char *)malloc(100);       
    char string[100]="something";
    b = &string;    
    printf("\n %s \n\n %s",string,b);
    printf("Enter a and c:-");  
    scanf("%d %d",&a,&c);
    find(a,c,*b);
    printf("\n%s",b);
}
void find(int x, int y,char  *b){
    if(x>y)
        b = "a is greater than b";
    else if(x=y)
        b = "both the values are equal";
    else
        b = "b is greater than a";
}

输出: - 东西

东西 输入a和c: - 10

20

东西

**

  • 表示它仍未更新函数中的值...

**

1 个答案:

答案 0 :(得分:1)

我在不到一分钟的时间内修复了你的代码。没有任何警告而且可能有效(我不会说出逻辑问题)。这意味着你的警告是一个常见的错误,即使是经验丰富的工程师也可能会这样做。但是,聪明的工程师将使用警告来修复这些警告。

this.selection.clear();

如果你检查一下,你会发现现在没有警告。 关于你的学习努力,我会尝试解释警告,并试着估计一下这些警告会产生什么结果。

  

警告:'main'的返回类型不是'int'

- 在这里你可以回答为什么我们更喜欢在main中返回int。 int main vs void main

  

警告:建议用作真值的分配括号

- 这是你遇到的最严重的错误。 =是asign,==是用于比较 Difference between = and ==

另一个错误,

  

冲突类型

  

隐式声明

意味着编译器的预处理器在函数声明之前到达函数调用(find(a,c,* b);)。因此,一个编译器可能会修复它并自动解析它而另一个编译器可能有错误。那就是& #39;为什么预处理器首先检查头文件,但由于你没有头文件(这很糟糕),你应该在调用之前声明该函数。 虽然你修好了,但你会收到警告,

  

警告:传递'find'的参数3使得指针来自整数   没有演员

这意味着您正在尝试传递指针的指针。 b是第一个位置的指针,它保存char数组的第一个元素的地址。所以你应该没有*传递它。

这是关于我们为什么不忽视错误的问题的一个很好的例子

。因为关于函数的隐式声明的错误导致发现另一个错误,比第一个错误更重要,隐藏在第一个警告之下。

另一个注意事项是你不需要在那里使用malloc。当你想在堆上分配一定数量的内存并在释放它之前保持它存活时,你可以使用malloc。

PS:我希望我能提供帮助,我希望你也可以从中获益。如果你有任何疑问,请不要犹豫(更好地聊聊,避免社区垃圾邮件)

谢谢。