#include <stdio.h>
#include <stdlib.h>
#define LEN 5
int main()
{
int i;
int count = 0;
size_t *ptr = malloc(sizeof(size_t)*LEN);
while(1){
for(i=0;i<LEN;i++){
scanf("%d",&ptr[i]);
}
for(i=0;i < ptr[i]; i++){
if(ptr = NULL || sizeof(ptr) < 0){
printf("nah");
} else if(ptr[i] == 7){
++count;
}
} printf("%d", count);
break;
}
free(ptr);
return 0;
}
我想要做的是找到数字7出现在malloc中的次数..计数效果很好但是我应该如何显示如果malloc s size is less than zero, or if it
为NULL,则必须返回 - 1?
另外,返回-1是什么意思?我对C编程很新... 任何帮助都会非常感激!
答案 0 :(得分:3)
C没有提供任何直接的工具来让程序知道函数中有错误,所以我们依赖函数的返回值。
例如,在您的情况下,只有大小为0或更大才有意义。如果&#34;错误&#34;发生,您可以返回-1,等待程序结果的任何人都会将结果视为无效,并假设存在某种错误。
因为这并没有融入C语言本身,所以执行纯粹是按照惯例。如果运行程序的人没有检查该值,并使用&#34; -1&#34;就像他们会使用&#34; 5&#34;一样,他们会遇到没有明显原因的问题。
标准库提供的函数通常带有返回值和错误的约定。 malloc
就是其中之一。检查documentation,&#34;返回值&#34;失败时为NULL。对于返回指针的函数,将NULL作为失败返回是一种常见的约定。
在您的代码中,您可以添加
size_t *ptr = malloc(sizeof(size_t)*LEN);
if (ptr == NULL) {return -1;}
正确检查返回值。
您希望尽快检查空值,因为当它可能为NULL时使用ptr
可能会导致segfaults。
另一方面,您sizeof
使用sizeof(ptr) < 0
是可疑的。可以在int
或size_t
等类型上调用Sizeof,也可以在变量上调用。在这种情况下,您将获得指针类型的大小,就像您调用sizeof(size_t*)
一样。查看documentation。
最后一点,您正在制作ptr
类型的size_t*
。指针类型几乎就像整数或其他数字类型,因此sizeof(ptr) < 0
条件永远不会为假。看起来你是C的新手,它使用了你在其他语言中看不到的使用指针和其他低级概念。在继续深入讨论之前,我建议加强对C中内存和指针的理解。我使用的一些资源是:TutorialsPoint,Class websites,Nice free guides和{{3 }}
答案 1 :(得分:0)
有很多问题:
这在for
循环中毫无意义,你应该在调用malloc
后立即进行测试:
if(ptr = NULL || sizeof(ptr) < 0){
printf("nah");
测试sizeof(ptr) < 0
也毫无意义(但这里不会受到影响),因为sizeof
的类型是无符号的,无论如何它都不会是负数。
if (ptr == NULL)
代替if (ptr = NULL)
。
while
循环毫无意义,你无条件地摆脱它。
printf("nah");
程序退出后不再继续。
你的程序缩进很糟糕,很难阅读。
这是更正版本:
#include <stdio.h>
#include <stdlib.h>
#define LEN 5
int main()
{
int i;
int count = 0;
size_t *ptr = malloc(sizeof(size_t)*LEN);
if (ptr == NULL) {
printf("nah");
return 1;
}
for (i = 0; i<LEN; i++) {
scanf("%d", &ptr[i]);
}
for (i = 0; i < LEN; i++) {
if (ptr[i] == 7) {
++count;
}
}
printf("%d", count);
free(ptr);
return 0;
}