将一个空指针强制转换为一个二维字符串数组指针(C/C++)

huangapple go评论65阅读模式
英文:

Casting a void pointer to a 2D String array pointer (C/CPP)

问题

我正在使用一个需要一个带有 void* 指针作为参数的函数库。我有一个二维字符串数组,并想通过该参数将该数组传递并在函数内提取它。我成功地将数组传递为指针,但不知道如何将该指针转换回我的数组。

这是我的当前代码:

String str_array[100][10];

int callback(void* data) {

  String (*str_array_ptr)[100][10] = (String (*)[100][10])data;

  (*str_array_ptr)[0][0] = "text";

  return 0;

}

void test() {
  callback(&str_array);
}

然而,在编译时,我获得以下错误消息:

error: ISO C++ forbids casting to an array type 'String* [100][10]' [-fpermissive]

PS: 我正在尝试使用 SQLite 库的 sqlite3_exec() 函数,并将 "SELECT SQL query" 的结果存储到一个二维字符串数组中。

SQLite C Interface - One-Step Query Execution Interface

英文:

I'm using a library which requires a function with a void* pointer as a parameter. I have a 2D string array and I want to pass that array through that parameter and extract it inside the function. I successfully passed the array as a pointer but I don't know how to convert that pointer back to my array.

This is my current code:

String str_array[100][10];

int callback(void* data) {

  String* str_array_ptr[100][10] = (String* [100][10])data;

  (*str_array_ptr)[0][0] = "text";

  return 0;

}

void test() {
  callback(&str_array);
}

However, when compiling, I obtain the following error message:

> error: ISO C++ forbids casting to an array type 'String* [100][10]' [-fpermissive]

PS: I'm trying to use the SQLite library's sqlite3_exec() function and store the result of a "SELECT SQL query" into a 2D string array.

SQLite C Interface - One-Step Query Execution Interface

答案1

得分: 5

不能将指针转换为数组。相反,您通过另一个指针访问数组。该指针的类型为 String (*)[10]。像这样:

String str_array[100][10];

int callback(void* data) { 

    String (*str_array_ptr)[10] = (String (*)[10])data;

    str_array_ptr[0][0] = "text"; // 注意没有 '*'

    return 0;
    
}

void test() {
    callback(str_array); // 注意没有 '&'
}

在创建指针的方式和访问指针的方式上,都不需要使用 &*,在您的代码中使用它们都是错误的。请参考上面的代码了解详细信息。

这里的根本问题(也许是您误解的问题)在于 String *x[10];String (*x)[10]; 之间的区别。在第一种情况下,x 是一个包含 10 个指向 String 的指针的数组,在第二种情况下,x 是指向包含十个 String 的数组的指针。您需要的是第二种选项。

英文:

You cannot cast a pointer to an array. Instead you access your array through another pointer. That pointer has type String (*)[10]. Like this

String str_array[100][10];

int callback(void* data) { 

    String (*str_array_ptr)[10] = (String (*)[10])data;

    str_array_ptr[0][0] = "text"; // Note no '*'

    return 0;

}

void test() {
    callback(str_array); // Note no '&'
}

Both the way you create the pointer, you don't need to use &, and the way you access the pointer, you don't need to use *, are also wrong in your code. See the code above for details.

The fundamental issue here (and maybe the issue you are misunderstanding) is the difference between String *x[10]; and String (*x)[10];. In the first case x is an array of 10 pointers to String, in the second case x is a pointer to an array of ten String. It's the second option that you want.

答案2

得分: 2

The line, String* str_array_ptr[100][10]; does not declare a pointer to a 2D array of String objects; rather, it declares a 2D array of pointers to String objects.

声明行 String* str_array_ptr[100][10]; 并不是声明了一个指向 String 对象的二维数组指针;相反,它声明了一个指向 String 对象的指针的二维数组。

The syntax for declaring a pointer to a 2D array is tricky; in your case, it is the following (to declare str_array_ptr as a pointer to a 100 x 10 array of String objects):

声明指向二维数组的指针的语法很棘手;在你的情况下,应使用以下方式声明(将 str_array_ptr 声明为指向 100 x 10 的 String 对象数组的指针):

String (*str_array_ptr)[100][10];

Casting to such a pointer is (arguably) even trickier; using a C++ static_cast (which you can when the source operand is a void*), you get the following code:

将其转换为此类指针 可能(可以说)更加棘手;使用 C++ 的 static_cast(当源操作数是 void* 时可以使用),你可以得到以下代码:

#include <iostream>
#include <string>
using String = std::string;

String str_array[100][10];

int callback(void* data) {

    String (*str_array_ptr)[100][10] = static_cast<String (*)[100][10]>(data);
    (*str_array_ptr)[0][0] = "text";
    return 0;
}

void test() {
    callback(&str_array);
}

One could argue that, if you really wish to use such a pointer to a 2D array (there are likely better design solutions in C++, such as the answer posted by john), then you could define a type for that pointer with a typedef or using... statement (e.g. using StrArrPtrType = decltype(&str_array);); however, the C++ and C programming communities generally frown (severely and rightly) on hiding pointers behind typedef or using aliases.

可以 认为,如果你真的希望使用这样的指向二维数组的指针(在 C++ 中可能有更好的设计解决方案,比如 john 发布的答案),那么你 可以 使用 typedefusing... 语句为该指针定义一个类型(例如 using StrArrPtrType = decltype(&str_array););然而,C++ 和 C 编程社区通常不赞成(严重且正确地)在 typedefusing 别名后隐藏指针。

英文:

The line, String* str_array_ptr[100][10]; does not declare a pointer to a 2D array of String objects; rather, it declares a 2D array of pointers to String objects.

The syntax for declaring a pointer to a 2D array is tricky; in your case, it is the following (to declare str_array_ptr as a pointer to a 100 x 10 array of String objects):

String (*str_array_ptr)[100][10];

Casting to such a pointer is (arguably) even trickier; using a C++ static_cast (which you can when the source operand is a void*), you get the following code:

#include &lt;iostream&gt;
#include &lt;string&gt;
using String = std::string;

String str_array[100][10];

int callback(void* data) {

    String (*str_array_ptr)[100][10] = static_cast&lt;String (*)[100][10]&gt;(data);
    (*str_array_ptr)[0][0] = &quot;text&quot;;
    return 0;
}

void test() {
    callback(&amp;str_array);
}

One could argue that, if you really wish to use such a pointer to a 2D array (there are likely better design solutions in C++, such as the answer posted by john), then you could define a type for that pointer with a typedef or using... statement (e.g. using StrArrPtrType = decltype(&amp;str_array);); however, the C++ and C programming communities generally frown (severely and rightly) on hiding pointers behind typedef or using aliases.

huangapple
  • 本文由 发表于 2023年6月2日 14:16:55
  • 转载请务必保留本文链接:https://go.coder-hub.com/76387588.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定