我正在学习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
东西
**
**
答案 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:我希望我能提供帮助,我希望你也可以从中获益。如果你有任何疑问,请不要犹豫(更好地聊聊,避免社区垃圾邮件)谢谢。