问题标签 [char-pointer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
2028 浏览

c - char 指针如何成为整个字符串?

假设我有以下字符串:

据我所知char *,保存字符串第一个字符的内存地址"Stack"。在计算机内存中,它可能表示如下:

如果我调用: printf("%s\n", my_string);,则会打印整个字符串。编译器如何知道打印整个字符串?因为据我了解,它只有一个字符的地址。

0 投票
2 回答
457 浏览

c++ - 试图将字符串转换为字符指针?

我一直在尝试在阳光下做所有简单的事情:

1) 从标准输入接收输入字符串。

2) 将其转换为 char 指针,以便我可以传递给表格/回文查找函数。

我对第 2 步的后半部分很有信心,但这是我无法破解的类型协议。以下是我有问题的主体。palin 函数的原型是int palin(char *str).

有任何想法吗?c_str()转换也存在问题,因为它需要一个常量指针 char,但我的 char 指针会改变。

0 投票
1 回答
463 浏览

c++ - 为什么将字符串作为文件名而不是 char* 传递时出现错误?

我知道 char 指针用于在C(带有空终止符)中创建字符串。但我不明白为什么在 C++ 中将字符串作为文件名传递时会出错,但它适用于char*.

h 原型和 cpp 函数签名在这两种情况下都匹配。

我已经包含了一些代码摘录以及我为这个“实用程序”文件所包含的所有内容(除了读取和写入功能之外,我还有一些其他功能。

我得到的错误是:

std::basic_ofstream::open(std::string&) 没有匹配函数

我也尝试过通过引用和指向字符串的指针传递。这是因为文件名仅作为 char 数组读取,有些来自 C 吗?

0 投票
1 回答
62 浏览

c++ - 使用开关盒错误

在以下代码中:

是char指针,错误是:error: switch quantity not an integer...

0 投票
2 回答
991 浏览

c++ - 将 std::string 的向量转换为 char***

我有一个 API 函数,它需要一个char***参数并想要传递一个vector<std::string>. 是否有std::string允许我这样做的成员函数?

这样,我只得到指向第一个元素的 char 指针:

0 投票
2 回答
4925 浏览

c++ - memcpy 导致程序在初始化的目的地崩溃

我正在开发一个更大的程序,而 memcpy 导致它崩溃。我在一个小程序中复制了这种情况,它做同样的事情。我注意到由于某种原因该程序运行良好

但是这个程序崩溃了

我不确定为什么会这样。有人可以解释为什么它会崩溃吗?

谢谢!

0 投票
2 回答
1288 浏览

c++ - 如何根据 OpenGL 规范安全地确保(在任何平台上)正确实现 char* 类型?

在尝试使用 c++ 和 OpenGL3+ 进行图形编程时,我遇到了一个关于 char 类型、指向它的指针以及潜在的隐式或显式转换为其他 char 指针类型的稍微专业化的理解问题。我想我已经找到了解决方案,但我想通过询问您对此的看法来再次确认。

当前(2014 年 10 月)的OpenGL4.5 核心配置规范(第 2.2 章命令语法中的表 2.2)列出了 OpenGL 数据类型并明确说明

GL 类型不是 C 类型。因此,例如,GL 类型 int 在本文档之外称为 GLint,不一定等同于 C 类型 int。实现必须准确使用表中指示的位数来表示 GL 类型。

此表中的 GLchar 类型被指定为位宽为 8 的类型,用于表示构成字符串的字符。
为了进一步缩小 GLchar 必须提供的内容,我们可以查看GLSL 规范OpenGL Shading Language 4.50,2014年 7 月,第 3.1 章字符集和编译阶段):

用于 OpenGL 着色语言的源字符集是 UTF-8 编码方案中的 Unicode。

现在,在我想要寻找的任何 OpenGL 库头文件中实现这一点的方式很简单

这当然违背了我刚刚引用的“GL 类型不是 C 类型”的陈述。

通常,这不会成为问题,因为 typedef 仅适用于底层类型可能在未来发生变化的情况。

问题始于用户实现。

通过一些关于 OpenGL 的教程,我遇到了各种将 GLSL 源代码分配给处理它所需的 GLchar 数组的方法。(请原谅我没有提供所有链接。目前,我没有这样做所需的声誉。)

网站 open.gl 喜欢这样做:

或这个:

在lazyfoo.net(第 30 章加载文本文件着色器)上,源代码从文件(我的首选方法)中读取到std::string shaderString变量中,然后用于初始化 GL 字符串:

我见过的最冒险的方法是我在谷歌加载着色器文件时得到的第一个方法——ClockworkCoders 加载托管在使用显式转换的 OpenGL SDK 上的教程——不是这样,GLchar*而是GLubyte*这样:

任何体面的 c++ 编译器都会在此处给出无效的转换错误。仅当设置了 -fpermissive 标志时,g++ 编译器才会发出警告。以这种方式编译它,代码将起作用,因为GLubyte最终只是typedef基本类型的别名,其unsigned char长度与char. 在这种情况下,隐式指针转换可能会产生警告,但仍然应该做正确的事情。这违反了与or兼容的C++ 标准,因此这样做是不好的做法char*。这让我想到了我遇到的问题: signedunsigned char*

我的观点是,所有这些教程都依赖于这样一个基本事实,即 OpenGL 规范的实现目前只是基本类型的 typedef 形式的装饰。规范绝不涵盖此假设。更糟糕的是,明确不鼓励将 GL 类型视为 C 类型。

如果在未来的任何时候 OpenGL 实现应该改变 - 无论出于何种原因 -GLchar不再是 的简单typedef别名char,这样的代码将不再编译,因为指向不兼容类型的指针之间没有隐式转换。虽然在某些情况下当然可以告诉编译器忽略无效的指针转换,但打开这样的不良编程大门可能而且会导致代码中出现各种其他问题。

我已经看到了一个完全符合我理解的地方:关于 Shader Compilation 的官方 opengl.org wiki 示例,即:

与其他教程的唯一区别是在分配之前显式转换const GLchar*。丑陋,我知道,然而,据我所知,它使代码对 OpenGL 规范(总结)的任何有效的未来实现都是安全的:一种位大小为 8 的类型,表示 UTF-8 编码方案中的字符。

为了说明我的推理,我编写了一个简单的类GLchar2来满足这个规范,但不再允许隐式指针转换到任何基本类型或从任何基本类型转换:

请注意,除了编写类之外,我还实现了输入和输出流运算符的重载,以正确处理类以及 c 字符串样式的空终止GLchar2数组的读取和写入。这在不知道类的内部结构的情况下是可能的,只要它提供类型charGLchar2(但不是它们的指针)之间的隐式转换。charGLchar2或它们的指针类型之间不需要显式转换。

我并不是说这个实现GLchar是值得的或完整的,但它应该是为了演示的目的。将其与 a 进行比较,typedef char GLchar1;我发现我可以用这种类型做什么和不能做什么:

我得出的结论是,至少有两种可行的方法可以编写始终GLchar正确处理字符串而又不违反 C++ 标准的代码:

  1. 使用从 char 数组到GLchar数组的显式转换(不整洁,但可行)。

    const GLchar* sourceCode = (const GLchar*)"some code";

    std::string sourceString = std::string("some code"); // can be from a file GLchar* sourceCode = (GLchar*) sourceString.c_str();

  2. 使用输入流运算符将字符串从文件直接读取到GLchar数组中。

第二种方法的优点是不需要显式转换,但要实现它,必须动态分配字符串空间。另一个潜在的缺点是 OpenGL 不一定会为输入和输出流运算符提供重载来处理它们的类型或指针类型。然而,正如我所展示的,只要至少实现了与 char 的类型转换,就可以自己编写这些重载。

到目前为止,我还没有发现任何其他可行的文件输入重载,它提供与 c-strings 完全相同的语法。

现在我的问题是:我是否正确地考虑过这一点,以便我的代码对 OpenGL 所做的可能更改保持安全,并且 - 无论答案是是还是否 - 是否有更好(即更安全)的方法来确保向上兼容性我的代码?

另外,我已经阅读了这个stackoverflow 问题和答案,但据我所知,它不包括字符串,因为它们不是基本类型。

我也不是在问如何编写一个提供隐式指针转换的类(尽管这将是一个有趣的练习)。这个示例类的重点是禁止隐式指针分配,因为如果 OpenGL 决定更改其实现,则无法保证会提供此类。

0 投票
2 回答
120 浏览

c - Unitialized Heap Allocation 误解(代码有效——需要纠正以消除 Valgrind 错误)

我的代码工作正常,但我收到 valgrind 错误。我想知道如何更正我的代码以正确使用这些 malloc 和 free 语句与 char * * dest。请不要告诉我不要 malloc 和 free,除非我在不正确的位置这样做。非常感谢在 answer03.c 中为 strcat_ex 提供一个或两个更正代码,或者解释我对 malloc、free 和 malloc 之后的初始化的误解。我为这篇长篇文章提前道歉,但我想提供一切必要的东西。

更多信息:我主要关注方法 strcat_ex (这与 strncat 不同——阅读函数描述以查看与 int *n 的区别)。问题的出现是因为我需要重新分配 dest (char **) 中字符串 (char *) 的参数内存,并且如果它没有分配足够的空间,并且在我 malloc 之后它没有被初始化。这对我来说没有意义如何在 malloc 之后初始化“堆”内存。我不相信初始化必须在 malloc 之后发生。

注意:pa03.c 和 answer03.h 根本不应该改变。

这是相关的 valgrind 错误(memcheck.log):

引用的行:

第 16 行(来自pa03.c)不应更改。作为调用方法参数defnsrc返回变量 result 的示例,在pa03.c中声明如下:

第 21 行(来自answer03.c):

第 29 行(来自answer03.c):

这是相关的源代码。这是 valgrind 错误所在并且需要 stackoverflow 知识(answer03.c):

编辑:已添加注释并已注释掉行以删除我在代码中与我的问题没有直接关系的错误。对于这些令人发指的错误,我深表歉意,但在其中留下了线条以帮助未来的读者理解。




低于此点的所有内容都应保持不变并且已知是正确的:

我的编译语句(Makefile):

我的 valgrind 声明(Makefile):

这是 strcat_ex ( answer03.h ) 的函数定义:

以下是调用 source 作为测试的相关代码(pa03.c):

这是相关的输出(来自pa03.c的打印语句):注意这是正确的输出(我当前的代码能够产生)。

最后的话:

我附上了编译此代码所需的文件以及使用 gcc 和 valgrind 在 linux 中的 valgrind 错误日志。valgrind 中还有更多内容,但我发布了我认为最相关的内容。提前致谢。

Zip 包括所有文件:
http ://www.filedropper.com/files_11

0 投票
1 回答
645 浏览

c - 来自 int 的基本 C 强制转换警告指针

有人可以告诉我如何纠正这个警告/错误。我试图只获取字符串的第一个字符来判断它是否为“-”。

错误:

带有警告/错误的来源:

第 15 行:

第 29 行:

完整来源:

0 投票
1 回答
1947 浏览

ios - 自 iOS 8.2 更新以来,stringWithUTF8String 返回 nil

我一直在使用 stringWithUTF8String 将我的 NSData 转换为 NSString,如下所示:

它运行良好;但是,自从 8.2 iOS 更新以来,[[NSString stringWithUTF8String:[responsedata bytes]]返回 nil。

我通过使用以下代码解决了这个问题:

在这两种情况下responsedata,印刷的描述都是一样的:<OS_dispatch_data: data[0x7aeb6500] = { leaf, size = 7, buf = 0x7c390360 }>

我的问题是:为什么第一个选项会返回 nil,为什么在 iOS 8.2 更新后突然返回?