我是一个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;
时,这将创建一个保存地址的变量。这与创建任何其他类型的变量相同,除了用于保存地址的内存外,没有分配其他内存。因为这样定义的指针没有初始化,所以它将包含一个不确定的地址值。在某些情况下(但不是全部),该值将是NULL
或0
,这就是为什么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/