标签: pointers

释放空指针

如果我们尝试释放指向NULL的指针,内存会发生什么?这有效吗?

为什么它不显示任何警告/错误消息?

c pointers

36
推荐指数
5
解决办法
1万
查看次数

迭代器和指针有什么关系?

使用迭代器的代码看起来非常像带指针的代码.迭代器是一些模糊的类型(std::vector<int>::iterator例如).

我没有得到的是迭代器和指针是如何相互关联的 - 迭代器是指针周围的包装器,带有重载操作以前进到相邻元素,还是其他什么?

c++ pointers iterator stl

35
推荐指数
4
解决办法
2万
查看次数

指针(地址)可以是负数吗?

我有一个函数,我希望能够返回失败未初始化的特殊值(它返回成功指针).

目前它为失败返回NULL,为未初始化返回-1,这似乎有效......但我可能会欺骗系统.iirc,地址总是积极的,不是吗?(虽然由于编译器允许我将地址设置为-1,这看起来很奇怪).

[更新] 我有另一个想法(如果-1是有风险的)是malloc一个char @全局范围,并使用该地址作为哨兵.

c signed pointers return-value

35
推荐指数
4
解决办法
2万
查看次数

取消引用指针会复制它吗?

是否取消引用指针并将其传递给通过引用获取其参数的函数会创建该对象的副本?

c++ pointers dereference

35
推荐指数
3
解决办法
1万
查看次数

如何理解C中的指针星*?

我正在努力使用指针符号*,我发现它在声明和表达式中的使用方式非常混乱.

例如:

int *i; // i is a pointer to an int
Run Code Online (Sandbox Code Playgroud)

但是语法背后的逻辑是什么?*之前的*是什么意思?我们来看下面的例子.请纠正我错在哪里:

char **s;
char *(*s); // added parentheses to highlight precedence
Run Code Online (Sandbox Code Playgroud)

这就是我失去轨道的地方.parantheses之间的*s意味着:s是一个指针?但指针是什么?括号外的*是什么意思:指向s指向的指针?

所以这个意思是:指向s指向的指针是指向char的指针?

我不知所措.*符号在声明和表达式中的解释是否不同?如果是这样,它的解释方式有何不同?我哪里错了?

c pointers dereference

35
推荐指数
6
解决办法
6万
查看次数

箭头操作员与点操作员

在我看来,C的箭头操作符( - >)是不必要的.点运算符(.)应该足够了.请使用以下代码:

typedef struct {
    int member;
} my_type;

my_type   foo;
my_type * bar;
int       val;

val = foo.member;
val = bar->member;
Run Code Online (Sandbox Code Playgroud)

我们看到箭头操作符必须用于取消引用栏.但是,我更愿意写

val = bar.member;
Run Code Online (Sandbox Code Playgroud)

关于我是否试图从结构或指针结构中拉出"成员",没有任何歧义.但是使用错误的运算符很容易,尤其是在重构代码时.(例如,也许我正在foo上做一些复杂的操作,所以我将代码移动到一个新函数并将指针传递给foo).我认为我不需要关心foo是否是指针; 编译器可以担心细节.

所以问题是:从C语言中消除 - >不是更简单吗?

c pointers structure

35
推荐指数
2
解决办法
5万
查看次数

C++将数组指针作为函数参数传递

我正在尝试使用数组指针作为生成数组的函数的参数.

void generateArray(int *a[],  int *si){
  srand(time(0));
  for (int j=0;j<*si;j++)
       *a[j]=(0+rand()%9);
} //end generateArray;

int main() {
  const int size=5;
  int a[size];

  generateArray(&a, &size);

  return 0;
} //end main
Run Code Online (Sandbox Code Playgroud)

但是当我编译它时,会出现以下消息:

cannot convert `int (*)[5]' to `int**' for argument `1' to `void generateArray(int**, int*)'
Run Code Online (Sandbox Code Playgroud)

c++ arrays pointers function

35
推荐指数
3
解决办法
13万
查看次数

C++中的静态全局变量

我想通过malloc方法创建一个整数数组.我希望这个数组是全局的,可以在我的程序中的任何地方使用.我把代码放在一个看起来像这样的头文件中:

static int *pieces;
Run Code Online (Sandbox Code Playgroud)

然后我有一个功能,用我想要的数字填充它.该函数位于命名空间中,命名空间在其自己的.cpp文件中实现.但是,我将头文件导入main.c并从创建数组的命名空间调用该函数,如:

pieces = malloc(sizeof(int) * 128);
Run Code Online (Sandbox Code Playgroud)

但是当我尝试访问main中的数组中的数字时(在调用创建我的数组的函数之后),它崩溃并说没有初始化那些碎片.但是在我拥有的功能中,我可以创建它并操纵它中的数字就好了.我的印象是,通过使片段成为静态变量,只要某个函数在任何地方发生变化(或设置它),那么这将影响变量在任何地方的使用.基本上我想说的是为什么片断在主体中显示未设置,即使我将它设置在我调用的函数中?

c++ variables static pointers global

35
推荐指数
3
解决办法
6万
查看次数

为什么C++中不存在引用成员?

在C++中,我可以在函数指针和函数引用之间进行选择(或者为了完整性,甚至是函数值):

void call_function_pointer (void (*function)()) {
    (*function) ();
}
void call_function_reference (void (&function)()) {
    function ();
}
void call_function_value (void function()) {
    function ();
}
Run Code Online (Sandbox Code Playgroud)

然而,当谈到方法时,我似乎没有在指针和引用之间做出这种选择.

template <class T> void call_method_pointer (T* object, void (T::*method)()) {
    (object->*method) ();
}
// the following code creates a compile error
template <class T> void call_method_reference (T& object, void (T::&method)()) {
    object.method ();
}
Run Code Online (Sandbox Code Playgroud)

这使我假设C++中不存在方法引用.真的吗?如果是,他们不存在的原因是什么?

c++ pointers reference pointer-to-member

35
推荐指数
1
解决办法
3003
查看次数

只要你没有取消引用它,是否可以很好地定义一个未对齐的指针?

我有一些C代码可以解析来自网络的打包/未打包二进制数据.

这段代码在Intel/x86下运行正常,但是当我在ARM下编译它时,它经常会崩溃.

正如您可能已经猜到的那样,罪魁祸首是未对齐的指针 - 特别是,解析代码会做出如下问题:

uint8_t buf[2048];
[... code to read some data into buf...]
int32_t nextWord = *((int32_t *) &buf[5]);  // misaligned access -- can crash under ARM!
Run Code Online (Sandbox Code Playgroud)

......显然不会在ARM-land中飞行,所以我修改它看起来更像这样:

uint8_t buf[2048];
[... code to read some data into buf...]
int32_t * pNextWord = (int32_t *) &buf[5];
int32 nextWord;
memcpy(&nextWord, pNextWord, sizeof(nextWord));  // slower but ARM-safe
Run Code Online (Sandbox Code Playgroud)

我的问题(从语言 - 律师的角度来看)是:我的"ARM修复"方法是否在C语言规则下定义明确?

我担心的是,即使只是有一个misaligned-int32_t指针也可能足以调用未定义的行为,即使我从来没有直接取消引用它.(如果我关心的是有效的,我想我可以修复通过改变问题pNextWord从的类型(const int32_t *)(const char *)的,但我宁愿不这样做,除非它实际上必须这样做,因为这将意味着做手工一些指针跨度计算)

c pointers alignment language-lawyer

35
推荐指数
3
解决办法
1914
查看次数