这个问题在这里已有答案:
在以下两段代码中,我不明白为什么后者会给出分段错误。我显然错误地认为我在两种情况下都传递了一个地址......指针是一个地址对吗?
所以这个工作:
#include<iostream>
using namespace std;
int test(char *a) {
*a = *a + 15;
return 0;
}
int main() {
char b;
b = 'c';
cout << b;
test(&b);
cout << b;
}
它输出:
r
但这个给出了分段错误,为什么?:
...
int test(char *a) {
*a = *a + 15;
return 0;
}
int main() {
char *b;
*b = 'c';
cout << b;
test(b);
cout << *b;
}
因为b
的内存不在这里分配:
char *b;
示例有效:
char *b = (char*)malloc(sizeof(char));
*b = 'a';
char a = 'a';
char *b = &a;
//C++ only
char *b = new char[1];
*b = 'a';
但这个给出了分段错误,为什么呢?
b - 它是指向内存中地址的指针。在*b = 'c';
行中,您为初始化区域分配了一些值。要避免它,你应该明白,在指定任何值之前你应该初始化参考b。
char *b;
/*-------*/
char bb;
b = &bb;
/*-------*/
*b = 'c';
cout << b;
test(b);
cout << *b;
因为定义指针并不意味着为您的程序分配了内存。
char *b;
*b = 'c';
这是未定义的行为,因为指针可以指向任何东西。
有两种方法可以解决这个问题。
char *b;
char ch = 'c';
*b = &ch; // taking the address of ch
现在,b
指向静态分配的ch
。
动态分配有一种方法。
char *b = malloc(sizeof(char));
*b = 'c';
free(b);
@Some程序员老兄已经提到的问题:在第二个例子中,变量b是一个指针,它指向一个未定义的地址。但是,声明和初始化指针的最佳方法是这样的:
char *b = NULL;
在第一个示例中,变量b被保存/位于堆栈中。你可以使用它。在第二个例子中,如上所述,你只有一个指针。如果要在此上下文中使用指针,则有两个选项:
char a = 'c';
char *b = &a;
char *b = malloc(sizeof(char) * 1); // allocate space on the heap
b[0] = 'c' // or *b = 'c'
... // do some stuff and then
free(b); // don't forget to free your allocated space
在C和C ++中,声明指针并不意味着变量指向有效的内存地址。将指针视为地址卡,其唯一目的是告诉您内存块的地址(在堆中)。
您有责任确保指针变量指向的地址是有效的内存块。如何使内存块成为有效的分配空间?好吧,你使用malloc
系列函数之一或new
关键字(仅限C ++)。
char *c; // Just an address somewhere
c = malloc(10); // Now, the address pointed by c is a 10 byte long memory block
.....
.....
free(c); // return the allocated memory to OS when you are done
在您的代码中,您不为指针分配内存。它指向哪里?未初始化的指针变量指向的地址是否为有效的内存块?没有。