pointers 相关问题

“指向”存储在内存中的另一个值的数据类型。指针变量包含某个其他实体(变量或函数或其他实体)的内存地址。此标记应用于涉及指针使用的问题,而不是引用。使用指针的最常见编程语言是C,C ++,Go和汇编语言。使用特定语言标记。其他有用的标签是描述指针使用的方法,函数,结构等。

为什么从 C# 到 C++ P/Invoking 时会收到 _CrtIsValidHeapPointer(block)?

我有一个简单的方法,应该使用本机代码模糊图像: 内部覆盖 void Apply(BitmapBuffer framebuffer, BitmapBuffer backBuffer, BitmapBuffer frontBuffer,

回答 1 投票 0

将临时 std::string 的 c_str() 存储在变量中时出现意外结果

我有一个成员函数定义如下: std::string returnStringMethod() { return /* 一些字符串 */; } 调用者看起来像这样: const char * ptr = returnStringMethod().c_str(); 这是

回答 4 投票 0

c_str使用不当

我有一个定义如下的方法: const std::string returnStringMethod() { std::string myString; // 填充 myString 返回我的字符串; } 现在,在呼叫者中,我正在做类似的事情

回答 4 投票 0

传递数组、固定大小数组和数组基址作为函数参数的区别

如果我想将已知或未知大小的数组作为函数参数传递,我对使用哪种语法感到困惑。 假设我有这些变体用于此目的: 无效 func1(char* str) { //p...

回答 7 投票 0

程序运行,但 Valgrind 在尝试写入 malloc 内存时检测到问题

为了了解更多 C 语言,我正在尝试重新创建基本数据结构。这是我尝试数组的一个最小示例,该数组可以编译并运行,但 valgrind 检测到问题: #包括 为了了解更多 C 语言,我正在尝试重新创建基本数据结构。这是我尝试数组的一个最小示例,该数组可以编译并运行,但 valgrind 检测到问题: #include <stdlib.h> #include <stdio.h> typedef void * vp_t; typedef struct { int len; vp_t *start; } arr_t; arr_t * array_new(int len) { arr_t *arr = malloc(sizeof(arr_t)); arr->start = malloc(len * sizeof(vp_t)); arr->len = len; return arr; } void array_set(arr_t *arr, int i, vp_t vp) { vp_t *dest = arr->start + i * sizeof(vp_t); *dest = vp; } int array_get(arr_t *arr, int i) { int *p = *(arr->start + i * sizeof(vp_t)); return *p; } void array_delete(arr_t *arr) { free(arr->start); free(arr); } int main() { int x=0, y=1, z=2; arr_t *arr = array_new(3); array_set(arr, 0, &x); array_set(arr, 1, &y); array_set(arr, 2, &z); for (int i = 0; i < 3; ++i) printf("%i ", array_get(arr, i)); putchar('\n'); array_delete(arr); return 0; } 程序按预期输出 1 2 3。然而,当我第二次和第三次调用 array_set 函数时,valgrind 检测到了一个问题。针对此处的示例代码运行 valgrind,我得到: ==91933== Invalid write of size 8 ==91933== at 0x109244: array_set (min.c:22) ==91933== by 0x109312: main (min.c:39) ==91933== Address 0x4a990d0 is 32 bytes before an unallocated block of size 4,194,032 in arena "client" ==91933== ==91933== ==91933== Process terminating with default action of signal 11 (SIGSEGV) ==91933== Access not within mapped region at address 0x2003A98F4C ==91933== at 0x109244: array_set (min.c:22) ==91933== by 0x109327: main (min.c:40) min.c:22指的是array_set函数中的*dest = vp。 min.c:39指的是array_set(arr, 1, &y)。 Valgrind 不抱怨第 38 行,array_set(arr, 0, &x)。 我一直在研究gdb,但我还没弄清楚。感谢您的浏览。 当您需要寻址数组时,只需将多少个单元格(除了单元格大小)添加到指针即可。 void array_set(arr_t *arr, int i, vp_t vp) { vp_t *dest = arr->start + i; *dest = vp; } int array_get(arr_t *arr, int i) { int *p = *(arr->start + i); return *p; } arr->start 的类型为 vp_t,因此当您向指针添加 1 时,编译器将增加所需的数量 (sizeof(vp_t)) 以转到下一个单元格。 这就是解决方案,但首先为什么,你需要一个 void ** 数组,如果你想创建一个整数数组,请使用 int** 创建,只有当你需要任何类型的数组时才推荐使用 void 数组。 不管怎样,错误在于你创建了一个 void* (一维),而实际上,应该是一个二维数组 void ** #include <stdlib.h> #include <stdio.h> typedef struct { int len; void **start; } arr_t; arr_t * array_new(int len) { arr_t *arr = malloc(sizeof(arr_t)); arr->start = malloc(len * sizeof(void*)); arr->len = len; return arr; } void array_set(arr_t *arr, int i, void *vp) { arr->start[i] = vp; } int array_get(arr_t *arr, int i) { return *(int*)arr->start[i]; } void array_delete(arr_t *arr) { free(arr->start); free(arr); } int main() { int x=0, y=1, z=2; arr_t *arr = array_new(3); array_set(arr, 0, &x); array_set(arr, 1, &y); array_set(arr, 2, &z); for (int i = 0; i < 3; ++i) printf("%i ", array_get(arr, i)); putchar('\n'); array_delete(arr); return 0; }

回答 2 投票 0

通过 `mem::transmute()` 来存储指针

我正在尝试为 C 集合库(Judy Arrays1)编写 Rust 绑定,该库仅提供自身空间来存储指针宽度值。我的公司有相当数量的现有代码......

回答 1 投票 0

编写一个函数,接受二维整数数组作为输入并返回其中所有元素的总和

我想编写一个函数,它接受 2D 整数数组(用双星号表示)作为输入,该数组的大小为 n(数组的数量)和 m(每个数组的大小)。 作为输出,函数...

回答 1 投票 0

将指针的地址加载到寄存器内联拇指组件中

我正在尝试使用内联拇指组件将地址从我的 c 指针读入寄存器。 这是一个可重现的: 静态 uint32_t 易失性 * 易失性 CurrentTaskStackPtr; 当前任务堆栈指针 = (

回答 1 投票 0

有没有办法从任何类调用方法指针

有没有办法使用指针从任何类调用任何方法? 像这样的东西: #包括 任意类类 { 民众: virtual void call(void* 实例, void (*callback)(float v...

回答 1 投票 0

有没有办法从任何类(没有模板)调用方法指针

有没有办法使用指针从任何类调用任何方法? 像这样的东西: #包括 任意类类 { 民众: virtual void call(void* 实例, void (*callback)(float v...

回答 1 投票 0

这个地址

我尝试找到这个指针的地址,但是这段代码显示了一个奇怪的 错误: #包括 使用命名空间 std; 类基类 { 民众: 无效测试() { 维...

回答 4 投票 0

这是一个不安全的 Rust 错误还是我错过了一些重要的东西?

我是 Rust 新手,遇到了一个奇怪的问题,程序的成功或失败取决于是否将不安全的 Rust 放入构造函数中。不确定这是一个错误还是我只是运气好......

回答 1 投票 0

描述可变结构行为的 Go 类型约束

我想定义一个通用函数,其中类型约束描述可变结构行为。 我所说的“可变行为”是指这样的接口: 类型 Unmarshaler int...

回答 1 投票 0

更改对内部结构的引用,或者是否可以更改 rust 中引用的引用

我目前正在尝试将 C 程序转换为 Rust。 C 程序具有以下结构(归结为 MRE): 类型定义结构{ 布尔值处于活动状态; uint32_t 值; } tMyInnerStruct; 类型定义

回答 1 投票 0

将任意(可变)大小的二维数组传递给函数

我想将二维数组传递给函数,但是,我想以任意大小执行此操作。 首先,请看以下代码: #定义 MAX_ROWS 8 #定义 MAX_SIZE 32 静态声音...

回答 1 投票 0

“.”、“::”和“->”之间的区别

在c++中这3块代码有什么区别吗: MyClass->m_Integer // 1 MyClass::m_Integer // 2 MyClass.m_Integer // 3

回答 4 投票 0

如何在python中改变指针的位置?

我想在程序获取一些特殊的单词时画出它们,实际上是实时的。 所以我写了这段代码,效果很好,但我在更改位置时仍然遇到问题...

回答 2 投票 0

动态内存分配和指针

我正在努力处理指针及其分配。 我想了解我的分配是否正确,否则应该如何进行。 另外,我收到有关 fgets 和 put 函数的警告...

回答 1 投票 0

K&R 练习 5-13 如何让我的程序处理无限行输入

练习 5-13。编写程序尾部,打印最后n行 其输入。默认情况下,n 设置为 10,但也可以是 由可选参数更改,以便 tail -n 打印 l...

回答 1 投票 0

指向枚举数组的引用/指针未获得正确的值

我有一个枚举数组: typedef 枚举 { 项目0, 项目1, 项目2 项目类型; ITEMS_TYPE MyItemsArray[] = { 项目0, 项目1, 项目2 }; bool findIndexOfItemInArray(int32_t valueTo...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.