在下面的两段代码中,我不明白为什么后一段给出了分段错误。我显然错误地认为我在两种情况下都传递了一个地址...指针是正确的地址吗?
所以这个可行:
#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;
}
答案 0 :(得分:1)
因为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';
答案 1 :(得分:0)
但是这给分割带来了错误,为什么?
b -它是指向内存中地址的指针。
在*b = 'c';
行中,您为未初始化区域分配了一些值。
为避免这种情况,您应该理解在分配 in 指针值之前,应先初始化b。
char *b;
/*-------*/
char bb;
b = &bb;
/*-------*/
*b = 'c';
cout << b;
test(b);
cout << *b;
答案 2 :(得分:0)
定义指针并不意味着已为程序分配了内存。
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);
答案 3 :(得分:0)
@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
答案 4 :(得分:0)
在C和C ++中,声明指针并不意味着变量指向有效的内存地址。将指针视为地址卡,它的唯一目的是告诉您内存块(在堆中)的地址。
您有责任确保指针变量所指向的地址是有效的内存块。如何使内存块有效分配空间?好吧,您可以使用name="r_end"
系列功能之一或malloc
关键字(仅C ++)。
new
在您的代码中,没有为指针分配内存。它指向哪里?未初始化的指针变量指向的地址是否是有效的存储块?不。