可能重复:
分段尝试在C中打印值时出错
我对C很新,但不知道为什么这个程序会破坏.如果我删除了与之相关的行,程序将编译并运行i,但如果我分配i,我不能再分配任何东西*ptr而不打破程序.
int main(void)
{
int i;
int *ptr;
i = 2;
*ptr = 5;
printf("%d",*ptr);
}
Run Code Online (Sandbox Code Playgroud) 在下面的代码,都amp_swap()和star_swap()似乎是在做同样的事情.那么为什么有人喜欢使用一个而不是另一个呢?哪一个是首选符号,为什么?或者只是品味问题?
#include <iostream>
using namespace std;
void amp_swap(int &x, int &y)
{
int temp = x;
x = y;
y = temp;
}
void star_swap(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
int main()
{
int a = 10, b = 20;
cout << "Using amp_swap(): " << endl;
amp_swap(a, b);
cout << "a = " << a << ", b = " << b << endl;
cout …Run Code Online (Sandbox Code Playgroud) 我正在学习C++指针,->操作员对我来说似乎很奇怪.而不是
ptr->hello();一个人可以写,(*ptr).hello();因为它似乎也有效,所以我认为前者只是一种更方便的方式.
是这样的情况还是有什么不同?
可能重复:
为什么在写入字符串时会出现分段错误?
我想编写一个函数来反转传递给它的给定字符串.但是我不能.如果我doReverse使用字符数组提供函数(请参阅下面的代码),我的代码运行良好.
我无法弄清楚为什么这不起作用.我能够访问str[0]的doReverse,但我不能用一个字符指针改变数组中的任意值.有任何想法吗?
void doReverse(char *str) {
str[0] = 'b';
}
void main(void) {
char *str = "abc";
doReverse(str);
puts(str);
}
Run Code Online (Sandbox Code Playgroud)
我知道如何通过将字符数组传递给它来编写反向函数:
void reverse1(char p[]) {
int i, temp, y;
for (i = 0, y = strlen(p); i < y; ++i, --y) {
temp = p[y-1];
p[y-1] = p[i];
p[i] = temp;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我想编写另一个获取char指针作为参数的版本.
我目前的代码效果如下:
if( objectPointer != NULL){
delete objectPointer;
}
Run Code Online (Sandbox Code Playgroud)
不起作用,因为编译器将指针设置为无效的十六进制数,例如:
等等....
那么在尝试删除对象之前检查无效指针的最佳方法是什么?
我是编码新手并尝试使用Objective-C加快速度.碰到了一些我不明白的代码.我希望有人可以为我澄清一下.在下面的例子中,我不确定*foo2是如何工作的以及为什么它没有被释放?
ClassOne *pointer = [[ClassOne alloc]init];
ClassTwo *foo = [[ClassTwo alloc]init], *foo2;
foo2 = [foo add: pointer];
[foo release];
foo = foo2
[pointer release];
[foo release];
Run Code Online (Sandbox Code Playgroud) 为什么我在声明指针时必须使用free():
int *temp = (int*)malloc(sizeof(int))
*temp = 3;
Run Code Online (Sandbox Code Playgroud)
但不是我这样做的时候:
int temp = 3;
Run Code Online (Sandbox Code Playgroud) 在阅读了关于指针和引用之间差异的问题之后,我决定使用引用而不是指针用于我的类字段.然而,似乎这是不可能的,因为它们不能被宣布为未初始化(对吧?).
在我现在正在处理的特定场景中,我不想使用正常变量(顺便说一下它们的正确用语是什么?)因为它们在我声明它们时会自动初始化.
在我的代码片段中,bar1自动使用默认构造函数实例化(这不是我想要的),而bar2导致编译器错误,因为你不能使用未初始化的引用(正确吗?),而*bar3很高兴因为指针可以声明未初始化(顺便说一下,最好将此设置为NULL吗?).
class Foo
{
public:
Bar bar1;
Bar &bar2;
Bar *bar3;
}
Run Code Online (Sandbox Code Playgroud)
看起来我必须在这种情况下使用指针,这是真的吗?另外,使用变量的最佳方法是什么? - >语法有点麻烦......运气好吗?什么智能指针,等等?这有关系吗?
尝试在我的类中实现引用变量字段并在构造函数中初始化它之后,为什么我会收到以下错误?
../src/textures/VTexture.cpp: In constructor ‘vimrid::textures::VTexture::VTexture()’:
../src/textures/VTexture.cpp:19: error: uninitialized reference member ‘vimrid::textures::VTexture::image’
Run Code Online (Sandbox Code Playgroud)
这是真正的代码:
// VTexture.h
class VTexture
{
public:
VTexture(vimrid::imaging::ImageMatrix &rImage);
private:
vimrid::imaging::ImageMatrix ℑ
}
// VTexture.cpp
VTexture::VTexture(ImageMatrix &rImage)
: image(rImage)
{
}
Run Code Online (Sandbox Code Playgroud)
我也试过在标题中这样做,但没有运气(我得到同样的错误).
// VTexture.h
class VTexture
{
public:
VTexture(vimrid::imaging::ImageMatrix &rimage) : image(rImage) { }
}
Run Code Online (Sandbox Code Playgroud)
弗雷德拉森 - 是的!有一个默认的构造函数; 我忽略了它,因为我认为这与问题无关(我多么愚蠢).删除默认构造函数后,我导致编译器错误,因为该类与std :: vector一起使用,需要有一个默认构造函数.因此看起来我必须使用默认构造函数,因此必须使用指针.羞耻......或者是吗?:)
请考虑以下代码片段:
int (*p)[3];
int (*q)[3];
q = p;
q++;
printf("%d, %d\n", q, p);
printf("%d\n", q-p);
Run Code Online (Sandbox Code Playgroud)
我知道指针算法是智能的,这意味着操作q++前进q足够的字节指向下一个3整数数组,所以第一次打印是' 12, 0' 并不意味着递增q使它在12中更大.
但第二次印刷确实令我惊讶.它打印1!
那么为什么它会打印1而不是12?它只是困惑我.
我有一些低级代码我写,我需要使用对象为挥发性的问题,但它不一定是这样,我想声明的类型为挥发性(可重用的原因).但是,我可以定义指向结构的限定变体的指针,如以下段中所述.
struct x {
int bar;
};
struct x foobar;
...
volatile struct x *foo = &foobar;
Run Code Online (Sandbox Code Playgroud)
现在foo实际上是指向该类型对象的指针:
volatile struct x {
volatile int x;
};
Run Code Online (Sandbox Code Playgroud)
因为volatile适用于所有struct成员.现在我的问题是当一个对象包含指向另一个对象的指针时,如何应用波动性?
struct x {
struct y *bar;
};
Run Code Online (Sandbox Code Playgroud)
指向x的volatile实例的指针然后将其视为:
volatile struct x {
struct y * volatile bar;
};
Run Code Online (Sandbox Code Playgroud)
或作为:
volatile struct x {
volatile struct y * volatile bar;
};
Run Code Online (Sandbox Code Playgroud)
我已经阅读了C标准,对此并不是很清楚,我可以通过多种方式轻松解释这些措辞.