小编jai*_*led的帖子

c和数组边界中的指针算术

我浏览了一个有一些常见问题解答的网页,我发现了这个陈述.

类似地,如果a有10个元素并且ip指向a [3],则无法计算或访问ip + 10或ip - 5.(有一种特殊情况:在这种情况下,您可以计算,但不能访问,指向不在数组末尾的不存在元素的指针,在本例中是&a [10].

我对这句话感到困惑

你无法计算ip + 10

我可以理解访问元素超出界限是未定义的,但计算!!!

我编写了以下代码片段,用于计算(让我知道这是网站对计算的意义)指针越界.

#include <stdio.h>                                                                                                                                                                  

int main()                                                                                                                                                                          
{                                                                                                                                                                                   
        int a[10], i;                                                                                                                                                               
        int *p;                                                                                                                                                                     

        for (i = 0; i<10; i++)                                                                                                                                                      
                a[i] = i;                                                                                                                                                           

        p = &a[3];                                                                                                                                                                  

        printf("p = %p and p+10 = %p\n", p, p+10);                                                                                                                                  
        return 0;                                                                                                                                                                   
}                     

$ ./a.out                                                                                                                                     
p = 0xbfa53bbc and p+10 = 0xbfa53be4     
Run Code Online (Sandbox Code Playgroud)

我们可以看到p + 10指向超过p的10个元素(40个字节).那么该声明在网页中的确切含义是什么.我错误地解释了什么.

即使在K&R(A.7.7)中,该声明也是如此:

+运算符的结果是操作数的总和.可以添加指向数组中的对象的指针和任何整数类型的值.... sum是与原始指针相同类型的指针,指向同一数组中的另一个对象,与原始对象相适应.因此,如果P是指向数组中对象的指针,则表达式P + 1是指向数组中下一个对象的指针.如果sum指针指向数组边界之外,除了高端之外的第一个位置,结果是未定义的.

什么是"未定义"的意思.这是否意味着总和将是未定义的,或者它仅仅意味着当我们取消引用它时行为是未定义的.即使我们不取消引用它,只是计算指向元素越界的指针,操作是否未定义.

c pointers

6
推荐指数
1
解决办法
3378
查看次数

C中指针类型转换(int到double)的核心转储

我遇到了这段代码:

void incme(double *p)
{
    *p += 1;
}

int i = 1;
incme((double *)&i);    /* WRONG */
Run Code Online (Sandbox Code Playgroud)

当我尝试执行它时,我得到核心转储.这段代码有什么问题.我们可以不输入强制转换为double类型的int指针.

谢谢.

c

2
推荐指数
1
解决办法
1672
查看次数

标签 统计

c ×2

pointers ×1