数组未使用指针正确初始化

时间:2019-10-06 12:25:01

标签: c arrays pointers

我正在尝试使用指针和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。其他人。

1 个答案:

答案 0 :(得分:1)

您不能访问未初始化的对象。 malloc不会初始化分配的数组的值,因此您无法打印它们。这样做会导致行为不确定。

第二,您拥有N元素,因此您需要

for (i = 0; i < N; ++i)

遍历数组时,在N * sizeof(int)malloc中需要N的原因是,malloc与数据类型无关,并且处理内存字节,但是变量{{1} }的数据类型为pointer,因此它知道其元素为int *