我正在尝试使用指针和malloc()
函数创建一个数组,然后通过for
循环对其进行初始化,但是并不是所有的值都被初始化了,有些似乎用不同的方式处理了我不明白的方式。
在第一个版本中,我编写了没有强制转换的for
循环,这在使用warning: comparison between signed and unsigned integer expressions
进行编译时导致了-Wall -Wextra
,并且在执行时始终给出相同的结果。
#include <stdio.h>
#include <stdlib.h>
#define N 50
#define SIZE sizeof(int)
void afficher (int *p) /* just to display the values of the array*/
{
int i;
for (i=0; i<=(int) ((N-1)*SIZE); i+=SIZE)
{
printf("%d ", *(p+i));
}
printf("\n\n");
}
int main()
{
int * pointer = NULL;
int i;
pointer = malloc (N*SIZE);
afficher(pointer); /*first display before initialising*/
if (pointer)
{
for (i=0; i<=(int)((N-1)*SIZE); i+=SIZE)
{
*(pointer+i) = 1; /*trying to initialise all values to 1 */
}
}
afficher(pointer); /*second display*/
free(pointer);
return 0;
}
因此,虽然我希望第一个显示器在程序启动之前显示内存中的内容,但我希望第二个显示器的所有值均为1,但是我得到的是
0 0 0 0 0 0 0 0 0 0 0 0 0 540024880 540024880 540031032 825438256 8246 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 540090417 540090417 540487988 926430256 8246 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
即使第一个显示有点怪异,我也不认为在尝试更改这些值时会出现问题,而且我也不知道为什么中间的这些值不会像这样更改为1。其他人。
答案 0 :(得分:1)
您不能访问未初始化的对象。 malloc
不会初始化分配的数组的值,因此您无法打印它们。这样做会导致行为不确定。
第二,您拥有N
元素,因此您需要
for (i = 0; i < N; ++i)
遍历数组时,在N * sizeof(int)
和malloc
中需要N
的原因是,malloc与数据类型无关,并且处理内存字节,但是变量{{1} }的数据类型为pointer
,因此它知道其元素为int *