请解释为什么我使用++运算符获得segfault.显式添加1和使用++运算符有什么区别?
using namespace std;
#include <iostream>
int main() {
char* p = (char*) "hello";
cout << ++(*p) << endl; //segfault
cout << 1 + (*p) << endl; // prints 105 because 1 + 'h' = 105
}
Run Code Online (Sandbox Code Playgroud) 这些工作:
struct WithString {
WithString(std::string){};
};
void takeString(std::string){}
//implicit conversions:
takeString("hello");
WithString("hello");
Run Code Online (Sandbox Code Playgroud)
但这不是:
WithString makeWithString() { return "hello";}
// error: no viable conversion from returned value of type 'const char [6]'...
Run Code Online (Sandbox Code Playgroud)
如果std::string在前两种情况下隐式转换为"hello" ,为什么不能在最后一种情况下呢?请注意,我没有将WithString构造函数指定为explicit,所以我希望这样的转换.
通过这样做,我可以让行为起作用:
struct WithString {
WithString(std::string){};
WithString(const char *){};
};
Run Code Online (Sandbox Code Playgroud)
我只是对这种奇怪感到好奇.如果我假定一个猜测,我会说这是因为前两个工作的情况下,转换之间const char *到std::string,但在错误的情况下,这反而会需要2转换链,首先从const char *到std::string,然后从std::string到WithString.也许这就是原因,但我不确定.
c++ stdstring object-construction implicit-conversion char-pointer
我有char**形式的字符串数组
我正在努力寻找该数组的长度:
typedef struct _stringArray
{
int (*Length)(char**);
char** (*Push)(char**, char*);
char** (*Pop)(char**, char*);
}StringArray;
StringArray* StringArray_Constructor(void)
{
StringArray* stringArray = (StringArray *)malloc(sizeof(StringArray));
stringArray->Push = StringArray_Push;
stringArray->Pop = StringArray_Pop;
}
char** StringArray_Push(char** array, char* string)
{
int size = 0; //how to find how many elements in the array object???
array = realoc(array, (sizeof(char *) * (size + 1));
array[size] = string;
return array;
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激!谢谢.
我似乎比我原先想象的更像是C++中的菜鸟.就我对C/C++的了解而言,这应该有效.我定义了一个字符数组,然后尝试指定一个开头的指针......我做错了什么?
// Create character array
char str[] = "t xtd 02 1CF00400 08 11 22 33 44 55 66 77 88 0 0 1234.567890";
// Assign pointer to beginning of array
char* p = &str;
Run Code Online (Sandbox Code Playgroud) 我试图更多地了解C中的char指针,但有一件事让我感到兴奋.
假设我想将char指针传递给函数并更改指针所代表的值.一个例子如下:
int Foo (char *(&Msg1), char* Msg2, char* Msg3){
char *MsgT = (char*)malloc(sizeof(char)*60);
strcpy(MsgT,"Foo - TEST");
Msg1 = MsgT; // Copy address to pointer
strcpy(Msg2,MsgT); // Copy string to char array
strcpy(Msg3,MsgT); // Copy string to char pointer
return 0;
}
int main() {
char* Msg1; // Initial char pointer
char Msg2[10]; // Initial char array
char* Msg3 = (char*)malloc(sizeof(char) * 10); // Preallocate pointer memory
Foo(Msg1, Msg2, Msg3);
printf("Msg1: %s\n",Msg1); // Method 1
printf("Msg2: %s\n",Msg2); // Method 2 …Run Code Online (Sandbox Code Playgroud) 为什么c ++编译器不会抱怨以下代码?
#include<iostream>
int main()
{
const char* p ="Hello";
std::string q = p + 'H';
std::cout << q << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
它正确地抛出了以下代码的错误
#include<iostream>
int main()
{
const char* p ="Hello";
std::string q = p + "World";
std::cout << q << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
编译器抛出的错误语句
test.cxx: In function 'int main()':
test.cxx:5: error: invalid operands of types 'const char*' and 'const char [6]' to binary 'operator+'
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我理解,为什么第一个代码没有抛出任何错误声明?
目前正在阅读 K&R,刚刚偶然发现了 char 指针。rn这本书里没有提到定义char指针时的内存分配,也许后面会解释。但这没有意义,所以我正在寻求帮助:)
1
// No errors
char *name;
char *altname;
strcpy(altname,name);
Run Code Online (Sandbox Code Playgroud)
2
// No errors, internals of *name have been successfully moved to *altname
char *name = "HI";
char *altname;
strcpy(altname, name);
Run Code Online (Sandbox Code Playgroud)
3
// Segmentation fault, regardless of how I define *altname
char *name = "HI";
char *altname = "randomstring";
strcpy(altname, name);
Run Code Online (Sandbox Code Playgroud)
4
// Segmentation fault, regardless of how I define *altname
char *name;
char *altname = " ";
strcpy(altname, name);
Run Code Online (Sandbox Code Playgroud)
5
// copies internals of *name only …Run Code Online (Sandbox Code Playgroud) 假设我有以下字符串:
char *my_string = "Stack";
Run Code Online (Sandbox Code Playgroud)
据我所知,它char *保存了字符串第一个字符的内存地址"Stack".在计算机内存中,它可能表示如下:
------------------------
| S | t | a | c | k | \0|
------------------------
^
my_string
Run Code Online (Sandbox Code Playgroud)
如果我打电话:printf("%s\n", my_string);,则打印整个字符串.编译器如何知道打印整个字符串?据我了解,它只有一个字符的地址.
我知道在 C 中相邻的字符串文字是连接在一起的。我想知道,相邻的字符串文字是否与 char*s 连接?
我问这个问题的原因是因为我想将两个字符串的串联传递给perror(),并且其中一个字符串事先未知,所以我必须使用char*.
perror("error opening " "file.txt"); // string literals are concatenated
char* filename = "file.txt"; // or some other file
perror("error opening " filename); // will this work?
Run Code Online (Sandbox Code Playgroud)