我想知道以下定义之间的差异:
// file.cpp:
namespace n
{
static char const * const str1 = "hello";
static char const str2[] = "hello";
}
Run Code Online (Sandbox Code Playgroud)
我想要的行为,我认为它们都提供:
这种语言是否有任何差异?如果存在依赖于实现的行为,我如何调查不同平台上的差异?
(对于这个例子,我对将这些行为与std :: string选项进行对比不感兴趣,但是如果你认为其他读者会感兴趣,也可以随意谈论它.)
当我想在C结构中存储动态数据数组时,有两种方法可以编写它:
typedef struct {
int row;
int col;
char* data;
} item1;
Run Code Online (Sandbox Code Playgroud)
要么
typedef struct {
int row;
int col;
char data[];
} item2;
Run Code Online (Sandbox Code Playgroud)
他们俩都会工作.但他们在我的64位Mac OSX上有一些差异,使用gcc Apple LLVM 5.1版(clang-503.0.38):
sizeof(item1) is 16
sizeof(item2) is 8
Run Code Online (Sandbox Code Playgroud)
为什么有区别?而且,这两种实现还有什么不同?
完整的测试代码是:
#include <stdio.h>
typedef struct {
int row;
int col;
char* data;
} item1;
typedef struct {
int row;
int col;
char data[];
} item2;
int main() {
printf("%d %d\n", sizeof(item1), sizeof(item2));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
16 8
Run Code Online (Sandbox Code Playgroud) 我试图使用两个指向相同字符串的指针就地反转一个字符串.第一个(char *p)指向字符串的起始位置,第二个(char *q)指向字符串的结束位置.因此,当我尝试使用gdb进行调试时,我在第16行遇到了分段错误.
当我试图打印的价值*p和*q,它工作正常.为什么我仍然能够访问这些位置时遇到段错误?
Breakpoint 1, main () at reverse.c:16
16 *q = *p;
(gdb) print p
$1 = 0x5555555547e4 "hello"
(gdb) print q
$2 = 0x5555555547e8 "o"
(gdb) step
Program received signal SIGSEGV, Segmentation fault.
0x00005555555546db in main () at reverse.c:16
16 *q = *p;
Run Code Online (Sandbox Code Playgroud)
该程序的实际代码是
#include<stdio.h>
int main() {
char *array = "hello";
char *p=&array[0];// pointer to the first element
// Make q point to last value of the array …Run Code Online (Sandbox Code Playgroud) 可能重复:
C中的char s []和char*s有什么区别?
char a [] ="string"之间的区别; char*p ="string";
首先,我想问一下我在哪里可以学习char*和char []的所有基础知识.
大多数时候,我发现自己在如何比较和如何申报方面苦苦挣扎.
例1:
char *test = "hello world";
Run Code Online (Sandbox Code Playgroud)
这将在编译时产生以下警告:
warning: deprecated conversion from string constant to ‘char*’
Run Code Online (Sandbox Code Playgroud)
例2:
vector<char*> test2;
test2.push_back("hello world");
Run Code Online (Sandbox Code Playgroud)
这将产生复制字符串的错误.
所以我想出的解决方案是:
(它是否正确?)
vector<char*> test3;
char *str1 = "hello world"
test3.push_back(str1);
Run Code Online (Sandbox Code Playgroud)
提前致谢!:)
============================================
这里的人提供了两个好的读物:
int main()
{
char *t1 = "Hi hello";
char t2[] = " strcat";
printf("%s", strcat(t1, t2));
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个程序时,它给了我分段错误
int main()
{
char t1[] = "Hi hello";
char *t2 = " strcat";
printf("%s", strcat(t1, t2));
}
Run Code Online (Sandbox Code Playgroud)
而当我运行下一个程序时,它运行正常并显示连接的字符串.为什么会这样 ?
这个问题非常封闭.只是想添加摘要.我理解的要点是:对于以这种方式声明的变量
char *t1 = "hi hello";
Run Code Online (Sandbox Code Playgroud)
只需确保添加类型限定符const.因为默认情况下它是只读存储器.不惜任何代价,我们无法修改数据.例如
t1[0] = "L";
Run Code Online (Sandbox Code Playgroud)
是不被允许的.以这种方式声明的变量不受我们控制,并且在程序的生命周期内将永久保留.我们甚至无法释放那段记忆.
char t1[10] = "hi hello";
Run Code Online (Sandbox Code Playgroud)
这样我们就可以更好地控制内存.我们被允许修改数组.只要范围消失,分配的内存就会被释放.
char t1[] = "hi hello"; char t2[8] = "hi hello";
Run Code Online (Sandbox Code Playgroud)
两个声明t1和t2非常相同,顺序分配了8个字符位置.
希望我有道理.如果没有请编辑.:)
我试图在一些公开的线性代数代码中使交流功能起作用.
公开的原型是......
int ilaenv_(int *, char *, char *, int *, int *,int *, int *);
Run Code Online (Sandbox Code Playgroud)
公开的代码有函数调用...
nb = ilaenv_(&c__1, "DGEQRF", " ", m, n, &c_n1, &c_n1);
Run Code Online (Sandbox Code Playgroud)
其中m,n,c_1和c_n1是整数,
错误消息是.
C++ 11 does not allow conversation from string literal to char *.
Run Code Online (Sandbox Code Playgroud)
我没有创建代码,但是从LAPACK站点下载了代码.我不愿意对可能有效的公开代码进行太多更改,以免引入错误.但是,此错误出现在我正在处理的程序中的许多函数中.
我该如何解决这个问题?
我知道这是安全的...
const char *get_str_literal() {
return "I literally can't even";
}
Run Code Online (Sandbox Code Playgroud)
但这是吗?
const char *get_str_literal() {
const char *str = "I literally can't even";
return str;
}
Run Code Online (Sandbox Code Playgroud)
如果不是,为什么?
编辑:下面的代码片段与上面的第二个代码片段有何不同?
const char *get_str_literal() {
const char str[] = "I literally can't even";
return str;
}
Run Code Online (Sandbox Code Playgroud)
字符串文字的内容是否被复制到自动数组存储中?发生什么了?
可能重复:
为什么在写入字符串时会出现分段错误?
我有以下程序:
char *s = "abcdf";
char s1[50] = "abcdf";
s1[0] = 'Q'; // Line 1
s[0] = 'P'; // Line 2
Run Code Online (Sandbox Code Playgroud)
为什么Line 1工作正常并Line 2导致程序崩溃?
我有一个关于memcopy的非常简单的问题,我已经能够修复但不明白为什么.以下代码在runtuime崩溃并出现"访问冲突":
char *src = "HELLO WORLD!";
char * dest = "hello world!";
memcpy(dest, src, strlen(src)+1);
Run Code Online (Sandbox Code Playgroud)
dest似乎足够大,据我所知,memcpy应该盲目地复制字节,所以我不明白这个问题.
将dest更改为数组例如可以char dest[13];解决问题,因此要求dest必须是未初始化的内存并创建数组才能为您执行此操作,而指针声明则不是吗?
干杯
这段代码基本上应该是一个字符串,比如说它是“abc de fgh”,输出应该是
cba
ed
hgf
Run Code Online (Sandbox Code Playgroud)
此处显示的代码确实将字符串放入一行中,但不会反转它们。我在想出那部分以及如何在方法中使用我的参数中的 char* 时遇到了麻烦。任何在正确方向上的帮助都会很棒!
void stringReverse(char* s){
char* i = 0;
char* j = strlen(s)-1;
//in order to swap the characters s[i] and s[j] make a temp
char* temp;
while(i < j){
temp = i;
i = j;
j = temp;
i++;
j--;
}
//end of the while loop means that it reversed everything (no need for if/else)
}
Run Code Online (Sandbox Code Playgroud)