【问题标题】:Assigning a pointer to the exact next memory address of an int将指针分配给 int 的确切下一个内存地址
【发布时间】:2019-11-08 22:08:41
【问题描述】:

我试图将一个指针分配给一个 int 数字的确切下一个内存地址,并给它这个数字的双倍值。但是我只能在 3(*4 是 int 的大小)或更多内存地址之后写入,否则它不会打印任何内容。

有效

#include <stdio.h>


int main(){
    int x, *ptr, memory_jump = 3;
    scanf("%d",&x);
    ptr = &x+memory_jump;
    *ptr = x * 2;
    printf("Given int = %d, Address = %d \nNext address content = %d,Next address pos = %d",x,&x,*ptr,ptr);

    return 0;
}

如果我将内存跳转降低到 2 或 1,它根本不会打印任何内容,因此会发生错误。

int main(){
    int x, *ptr, memory_jump = 2;
    scanf("%d",&x);
    ptr = &x+memory_jump;
    *ptr = x * 2;
    printf("%d", (ptr-2));
    printf("Given int = %d, Address = %d \nNext address content = %d,Next address pos = %d",x,&x,*ptr,ptr);

    return 0;
}

谁能解释这两个下一个内存地址会发生什么?

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    你的“实验”有缺陷。

    在这两种情况下,您都在访问内存位置并分配值,就好像在这些位置有一个有效的int 对象。而且都是undefined behaviour.

    【讨论】:

    • 你是对的,但在第一种情况下,当我在不同的电脑上尝试时,输出完全相同。这是否仍然意味着它是未定义的行为?
    • 未定义的行为不是由“似乎起作用”定义的,如果根据语言规范未定义行为,则它是未定义的。它可能会起作用,也可能会崩溃和燃烧,而且您无法保证它不会那样做! (进一步阅读:en.cppreference.com/w/c/language/behavior
    • 好的,还有一个问题,这些内存地址是否可以包含有关 int 的信息,例如 char 数组有 \0 来表示数组的结尾?
    • 我不知道。我不认为 char 数组有空终止符,您正在考虑 C 空终止字符串,它们并不完全相同。 const char* str = "cheese"; 有一个空终止符,但 char str[42]; 没有。
    猜你喜欢
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    相关资源
    最近更新 更多