指针可以表现为变量吗?

时间:2010-09-01 08:06:38

标签: c

我对此计划感到困惑。

#include <stdio.h>

int main(void)
{
        int value = 10;
        char ch = 'A';

        int* ptrValue = &value;
        char* ptrCh = &ch;

        int* ptrValue1 = value;
        char* ptrCh1 = ch;

        printf("Value of ptrValue = %d and value of ptrValue1 = %d\n", *ptrValue, ptrValue1);

        printf("Value of ptrCh = %c and value of ptrCh1 = %c\n", *ptrCh, *ptrCh1);
}

编译此程序时我收到两条警告

  

的UniPro @ ubuguest:/ SoftDev / ADSD /模块   1 / Unit 1 / Rd / C / System $ cc   charPointers.c -o charPointers
  charPointers.c:在功能上   'main':
charPointers.c:11:   警告:初始化使指针   来自没有演员的整数
  charPointers.c:12:警告:   初始化使指针来自   没有强制转换的整数

我知道他们的意思。

运行程序时出现以下错误。

  

的UniPro @ ubuguest:/ SoftDev / ADSD /模块   1 / Unit 1 / Rd / C / System $   ./charPointers
ptrValue的值   = 10并且ptrValue1 = 10的值>分段错误

我知道我在第二次printf方法时遇到错误。

所以我的问题是如果我在指针中存储一个值,为什么我们不能去引用它呢?它的行为是否像变量一样?

感谢。

6 个答案:

答案 0 :(得分:5)

通过作业

char* ptrCh1 = ch;

您将地址设置为0x41,而不是值。程序稍后将尝试取消引用0x41(即,在地址0x41处获取数据),这是一个非法地址。因此,分段错误

答案 1 :(得分:2)

指针存储某事物的地址(或NULL)。因此int *可以存储int的地址。您可以使用一元&运算符获取某些内容的地址。

那么,将10存储在int指针中意味着什么?好吧,10不是int的地址,所以你得到“初始化使得指针来自没有强制转换的整数”警告,并且因为你在int *中存储了除int的地址以外的其他内容并尝试取消引用它,你得到未定义的行为。

在你的情况下可能发生的事情是10被解释为一个内存地址,当你取消引用一个指针时,它会去取取该地址的任何内容(在你的情况下是内存地址10)。可能没有任何内容,没有映射内存区域,并且你是段错误。

答案 2 :(得分:1)

你可以取消引用它,但你获得有效内存块的可能性非常小。此处有效表示您的流程具有该点的访问权限。

操作系统将阻止您修改不属于您的进程的内存。它通过分段错误“异常”响应那种无效的内存访问。

答案 3 :(得分:1)

指针指向一个内存位置(然后您可以在其中存储一些值)。在这里

    int* ptrValue1 = value;
    char* ptrCh1 = ch;

指定变量的的指针(而不是地址),因此指针很可能指向无效的内存位置,因此是段错误。

请注意,在许多体系结构中,有效的内存位置以高偏移量开始,因此像“A”这样的小整数值或“A”的(ASCII值)永远不能指向有效的内存位置。这种低内存位置通常由操作系统本身保留/使用(因此它们可以防止修改 - 如果您尝试,则会出现段错误)。如果您尝试直接访问另一个进程使用的内存,通常会发生同样的情况。

答案 4 :(得分:0)

这是因为最后一行中的*ptrCh1,你试图取消引用它。删除*以使其正常工作(不过它没有多大意义)。

答案 5 :(得分:0)

确定它必须是段错误的。你在指针中存储任何值(正如你所说的编译器警告你),然后你取消引用它,无论它指向何处。 你还有什么期望?