这一问题可作为所有常见的性质问题的参考:
当我将数据复制/扫描到未初始化指针指向的地址时,为什么会有一个神秘的崩溃或“分段错误”?
例如:
char* ptr;
strcpy(ptr, "hello world"); // crash here!或
char* ptr;
scanf("%s", ptr); // crash here!发布于 2016-05-31 15:17:37
指针是一种特殊类型的变量,只能包含另一个变量的地址。它不能包含任何数据。您不能“将数据复制/存储到指针中”--这没有任何意义。您只能将指针设置为指向其他地方分配的数据。
这意味着,为了使指针有意义,它必须始终指向有效的内存位置。例如,它可以指向堆栈上分配的内存:
{
int data = 0;
int* ptr = &data;
...
}或在堆上动态分配的内存:
int* ptr = malloc(sizeof(int));在初始化指针之前使用指针总是一个错误。它还没有指向有效的内存。
这些示例都可能导致程序崩溃或其他类型的意外行为,例如“分段错误”:
/*** examples of incorrect use of pointers ***/
// 1.
int* bad;
*bad = 42;
// 2.
char* bad;
strcpy(bad, "hello");相反,您必须确保指针指向(足够)分配的内存:
/*** examples of correct use of pointers ***/
// 1.
int var;
int* good = &var;
*good = 42;
// 2.
char* good = malloc(5 + 1); // allocates memory for 5 characters *and* the null terminator
strcpy(good, "hello");注意,还可以将指针设置为指向定义良好的“letting”,方法是让指针指向NULL。这使得它成为一个空指针,这是一个指针,保证不会指向任何有效内存。这与完全未初始化指针不同。
int* p1 = NULL; // pointer to nowhere
int* p2; // uninitialized pointer, pointer to "anywhere", cannot be used yet但是,如果您试图访问null指针指向的内存,则可能会遇到类似于使用未初始化指针时的问题:崩溃或分段错误。在最好的情况下,您的系统注意到您正在尝试访问地址null,然后抛出一个"null指针异常“。
空指针异常错误的解决方案是相同的:在使用它之前,必须将指针设置为指向有效内存。
进一步读:
指向无效数据的指针
How to access a local variable from a different function using pointers?
Can a local variable's memory be accessed outside its scope?
分割故障及引起
发布于 2017-01-20 11:42:18
strcpy希望您传递两个指向两个字符数组的指针(第一个指针不能是常量),如以下签名:
char * strcpy ( char *目的地,const char * source );
样本使用情况:
char* ptr = malloc(32);strcpy(ptr,"hello world");
char str32;strcpy(str,"hello world");"%[^\t\n]s"(选项卡、换行符)或"%[^ \t\n]s" (空格、选项卡、换行符))。
char *ptr = malloc(32);scanf("%31^\n",ptr);
(在现实生活中,不要忘记检查scanf()的返回值!)发布于 2019-01-19 16:28:51
学习C时经常发生的一种情况是试图使用单引号来表示字符串文字:
char ptr[5];
strcpy(ptr, 'hello'); // crash here!
// ^ ^ because of ' instead of "在C中,'h'是单个字符文字,而"h"是包含'h'和空终止符\0 (即2 char数组)的字符串文本。此外,在C中,字符文字的类型是int,也就是说,sizeof('h')等同于sizeof(int),而sizeof(char)是1。
char h = 'h';
printf("Size: %zu\n", sizeof(h)); // Size: 1
printf("Size: %zu\n", sizeof('h')); // likely output: Size: 4https://stackoverflow.com/questions/37549594
复制相似问题