#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中出现的次数。计数工作得很好,但是我应该如何显示如果mallocs size is less than zero, or if it为空,它必须返回-1?
另外,返回-1意味着什么?我是个C编程新手。任何帮助都将是非常感谢的!
发布于 2017-05-05 00:26:46
C没有提供任何直接的工具来让程序知道函数中有错误,所以我们转而依赖函数的返回值。
例如,在您的例子中,只有当大小为0或更大时才有意义。如果出现" error“,您可以返回-1,等待程序结果的任何人都会看到结果无效,并假定存在某种类型的错误。
因为这不是C语言本身的特性,所以强制执行完全是按照约定进行的。如果运行你的程序的人不检查这个值,而是像使用"5“一样使用"-1”,他们就会遇到没有明显原因的问题。
标准库提供的函数通常带有自己的返回值和错误约定。malloc就是其中之一。检查documentation,失败时返回值为NULL。对于返回指针的函数,返回NULL作为失败是一种常见的约定。
在您的代码中,您可以添加size_t *ptr = malloc(sizeof(size_t)*LEN); if (ptr == NULL) {return -1;}以正确检查返回值。
您希望尽快检查NULL值,因为在可能为null的情况下使用ptr可能导致segfaults。
另请注意,您在sizeof(ptr) < 0中使用sizeof是可疑的。Sizeof可以在int或size_t这样的类型上调用,也可以在变量上调用。在本例中,您将获得指针类型的大小,就像您调用sizeof(size_t*)一样。查看documentation。
最后要注意的是,您正在生成size_t*类型的ptr。指针类型几乎类似于整数或其他数字类型,因此sizeof(ptr) < 0条件永远不会为false。看起来你是第一次接触C,它使用了指针和其他低级概念,这在其他语言中是看不到的。在继续深入之前,我建议巩固您对C中内存和指针的理解。我使用的一些资源包括:TutorialsPoint、Class websites、Nice free guides和wikibooks
祝好运!
发布于 2017-05-05 00:46:41
有很多问题:
这在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;
}https://stackoverflow.com/questions/43787863
复制相似问题