我是一个C语言新手,我试图使用如下指针。
po1定义为指向地址的指针。PC为它分配1字节的内存。po2是相同的。我想得到po2指向的内存地址,但只得到一个意外的0,显然不是地址。

#include <stdio.h>
int main(int argc, char *argv[]) {
    char *po2, *po1;
    printf("---%d---\n", po2);
    return 0;
}

输出为:
demo11.c:5:23:警告:format指定类型“int”,但参数的类型为>“char*”[-Wformat]
printf(“-****--%d-**--\n”,po2);
~~ ^~~
%s公司
生成1个警告。
-****--0个-****--
然后我试图将foo的值赋给po2所指向的内存,但它给出了一个错误。
#include <stdio.h>
int main(int argc, char *argv[]) {
    char *po2, *po1;
    char foo = 'D';
    *po2 = foo;
    printf("%c---------------\n", *po2);
    return 0;
}

输出为:
因信号而终止:分段故障(11)
显然,错误是由语句引起的;
任何帮助都将不胜感激,谢谢。

最佳答案

您在printf()中的字符串中使用的格式说明符不正确。%d专门用于整数。对于指针,应该使用%p
看一下您收到的警告,您可以从这个位来确定:format specifies type 'int' but the argument has type 'char *'这基本上意味着格式说明符(the%d)指示一个int类型变量,但您提供了一个char *类型。
当您说*po2 = foo;时,实际上是将foo的值赋给po2所指的任何对象,而不是将foo的地址赋给po2本身。
首先,当给指针分配地址时,不要使用*,这样第一部分就变成po2 =。其次,要分配foo的地址,而不是它所包含的值,因此应该使用“address of”运算符,即&,这样整行就变成po2 = &foo;
当前代码出现分段错误的原因是,正如前面提到的,当前代码将foo的值赋给po2指向的任何位置。由于指针尚未正确初始化,因此它包含一些无效的不确定地址(通常NULL)。因此,当PC试图找到这个无效地址时,它试图找到一个不存在的内存位置位置(例如,位置0或位置50亿等)。它不能这样做,因此会导致分割错误。
你好像有点误解了指针的工作原理。当您使用char *po2;时,这将创建一个保存地址的变量。这与创建任何其他类型的变量相同,除了用于保存地址的内存外,没有分配其他内存。因为这样定义的指针没有初始化,所以它将包含一个不确定的地址值。在某些情况下(但不是全部),该值将是NULL0,这就是为什么printf在发出警告后输出0
如果希望指针指向变量po2,则将foo的地址放入指针中。foo将保留po2的地址,foo仍将保留foo'D'不会神奇地移动到'D'指向的内存的其他部分,它会保持在原来的位置。如果要使用指针更改它所指向的值,那么po2中的值将是更改的值。
例如:

char *po2;   // A pointer variable that will hold an address of a char
char foo = 'D'; // A variable that will hold a char
po2 = foo;   // po2 contains a new copy of 'D', this is not what you wanted
po2 = &foo;  // po2 contains address of foo, this is right
*po2 = 'C';  // foo will now contain 'C'
*po2 = foo;  // same as using foo = foo
po2 = 'C';   // po2 contains 'C', this is not what you wanted

关于c - 尝试为原始指针值赋予新值时,为什么会导致错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42414803/

10-11 21:45