2014-04-22 77 views
0

我正在学习C编程。我想找到一个数组的中间点而不知道它的长度。如果数组的长度是6,中间点必须是4,但是我有一个错误,我不知道它是什么。这里是我的代码:在c数组中找到中点

int *a =(int *) malloc(sizeof(int) * n); 

    int i; 
    for(i = 0; i < sizeof(a); i++) 
     scanf("%d",&a[i]); 

任何人都可以帮忙,谢谢。

+2

[请不要在C]中输入'malloc()'的返回值(http://stackoverflow.com/a/605858/28169)。 – unwind

+0

那么我如何知道数组的长度? – user3376115

+3

“那么我怎么知道阵列的长度?”你将它存储在一个单独的变量中。相信与否,当你动态分配一块内存时,这是C语言中唯一的方法。 – dasblinkenlight

回答

10

scanf被读入一个地址,所以:

scanf("%d",a[i]) 

真的应该是:

scanf("%d", &a[i]) 

而且当你做不忘记free内存。 (对于这样的小应用程序也不要紧,但如果你当你从学习阶段走出,并进入了现实生活中的编程习惯了一个良好的习惯)

而且也:sizeof(a)是指针的大小,而不是指针指向的内存大小(正如在其他答案中正确指出的那样)。

+0

另外,应该包括'';如果'scanf'失败,代码可能会尝试打印未初始化的内存,所以使用'calloc'会更安全一些(代替正确的错误检查) –

+0

我只是修改它,仍然得到错误的结果,请帮忙 – user3376115

+0

@fritzone:从评论中添加关于分配和element_count错误的信息?因为这样它甚至不会尝试回答这个问题。 – Deduplicator

2

这是错的:for(i = 0; i < sizeof(a); i++)。这里sizeof(a)将返回大小的int指针,可能是4或8在您的系统上。通常,不要使用sizeof来确定数组的元素数量,而是使用单独的变量。

您需要改为使用for(i = 0; i < n; i++)

+0

使用sizeof来确定一个***数组的元素数***是一种好的做法,它允许丢弃魔术常量。你的意思是*指向数组*。 – Deduplicator

+0

@Deduplicator根据我的经验,使用常量常量总是比'((sizeof(a)/ sizeof(a [0]))'-hack更好,特别是对于无法理解数组/指针之间差异的初学者而言。 '不知道你的意思是什么“数组指针” – user694733

+0

使用常量常量是可以的,除非你正在讨论的数组大小适合他们的初始化程序,为了让我的其他点更清晰,把它改为指向多个'int'所以'int *'。(混淆数据结构和C类型时没有明确的区分) – Deduplicator