我第一次学习编程,从C开始,学习一本德语编程书。不幸的是,动态内存管理部分的页面有点短,解释得很快,这就是为什么我相处得不太好的原因。
我的阵列有多大
Int的大小,但我定义了array[0]和array[1],我能走多远?
当时我曾短暂地尝试过Python,在那里我知道像my_Array[1][2]这样的数组,因此我可以单独输出每一个东西,并了解它在哪里。不幸的是,我现在没有想到这一点。
现在,如果我在数组[1]中放入数字3,然后放入数字4。
这里的数字是如何存储的
它们存放在哪里
如何从数组[1]中检索每个数字
如果我执行realloc(array,array[0]+1(,0字段将以何种方式从该数组展开
在我看来,数组是一维的,以便将数字排列如下:
array[0]={..,3,4,5,…}
array[1]={..,3,4,5,…}
并且该命令始终只在该数组的末尾提供一个位置。
我现在刚从解决方案中获取代码。
提前谢谢!
#include <stdio.h>
#include <stdlib.h>
int main()
{
int value;
int *array = malloc(sizeof(int));
array[0] = 0;
int i = 1;
while (value >= 0)
{
printf("Enter a positive number to add a nubmern");
printf("Or enter a negative number to end.n");
printf("Enter number: ");
scanf("%i",&value);
if (value >= 0)
{
array = realloc (array, array[0] + 1);
array[i] = value;
i++;
array[0]++;
}
for (int i = i; i <= array[0]; i++)
{
printf("Value %i: %in", array[i]);
}
}
free(array);
return 0;```
对于初学者来说,程序具有未定义的行为,至少因为您在while循环的条件下使用了未初始化的变量value
int value;
//...
while (value >= 0)
你应该写例如
int value = 0;
//...
while (value >= 0)
或者,与其使用while循环,不如使用do-while循环。
其次,最初数组[0]的值等于0,而变量i等于1
array[0] = 0;
int i = 1;
所以这个代码片段
array = realloc (array, array[0] + 1);
array[i] = value;
再次调用未定义的行为,因为您只为一个字节分配了内存。所以这个声明
array[i] = value;
正在尝试访问超出分配内存的内存。
注意realloc
调用中使用的表达式的值
array[0] + 1
等于1,2,3。。。,n而不是CCD_ 3。
并且不存在阵列array[0]
和阵列array[1]
。它们是类型为int
的标量对象。要访问数组的元素,请使用类似array[i]
的下标运算符,其中i
小于存储在元素array[0]
中的值。这就是for循环必须看起来像
for (int i = i; i < array[0]; i++)
^^^^^^^^^^^
同样在打印的调用中
printf("Value %i: %in", array[i]);
使用了两个转换说明符,而只为它们提供了一个参数。
例如,程序可以按照以下方式查找
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
int *array = malloc( sizeof( int ) );
if ( array != NULL )
{
array[0] = 1;
int value;
do
{
printf( "Enter a positive number to add a nubmern" );
printf( "Or enter a negative number to end.n" );
printf( "Enter number: " );
if ( scanf( "%d", &value ) == 1 && value >= 0 )
{
int *tmp = realloc( array, ( array[0] + 1 ) * sizeof( int ) );
if ( tmp != NULL )
{
array = tmp;
array[array[0]++] = value;
}
else
{
value = -1;
}
for ( int i = i; i < array[0]; i++ )
{
printf( "Value %i: %in", i, array[i] );
}
}
else
{
value = -1;
}
} while ( value >= 0 );
}
free( array );
}