Redian新闻
>
为什么我这段简单的程序segment fault
avatar
为什么我这段简单的程序segment fault# JobHunting - 待字闺中
d*f
1
void swap( char* cA, char* cB)
{
char ct = *cA;
*cA = *cB;
*cB = ct;
}
int main(int argc, char* argv[])
{
char *a = "a";
char *b = "b";
swap(a, b);
}
貌似问题出在 *cA = *cB;?
如果是char a = 'a'; char b = 'b'; swap(&a,&b);不会有segment fault.
avatar
d*e
2
前面ihasleetcode有个贴应该也解释过类似的。
char * a = "a"
定义的是一个c-string constant,不能修改它的值。所以在swap就出现segment fault
了。

【在 d**f 的大作中提到】
: void swap( char* cA, char* cB)
: {
: char ct = *cA;
: *cA = *cB;
: *cB = ct;
: }
: int main(int argc, char* argv[])
: {
: char *a = "a";
: char *b = "b";

avatar
r*o
3

a and b are stored as literal string so you cannot change them.
...................

【在 d**f 的大作中提到】
: void swap( char* cA, char* cB)
: {
: char ct = *cA;
: *cA = *cB;
: *cB = ct;
: }
: int main(int argc, char* argv[])
: {
: char *a = "a";
: char *b = "b";

avatar
d*f
4
是这个问题,比如
char *a = "hi"; a[0] = 'y'; 会报错
如果定义成 char[] = "hi"; 就没有问题.
avatar
d*f
5
K&R C 原话是这么说的,P104
pmessage is a pointer, initialized to point to a string constant; the
pointer may subsequently be modified to point elsewhere, but the result is
undefined if you try to modify the string contents.
avatar
P*P
6
主要还不是string的问题
你这个程序基本没有对的地方,
就算都把char改成int还是错
人家gcc编译的时候都把warning给你了还不知道要改
avatar
d*f
7
程序是没有问题的,问题出在C++
const char* c = "hi";
前面那个const是implicit.
char c[] = "hi";
也不好,这个要depends on compiler.
所以最好的办法是,C++下直接用string
尽量少用cstring.
avatar
d*f
8
从这里出发,我又想到好多东西.
第一个就是 char ** p 和 char * a[]. p, p+1, *p, *(p+1)与a, a[0], a[1]在函数
传递的时候到底有什么不同.
第二个就是 int ** p 和 int a[][], 2D Array where column and row are both
unknown,到底应该怎样传递.
第三个是怎样去实现一个高效简单的2D Dynamic Array?
第二个问题的来源是,面试的时候,我被问到一个常见的题目:
find a int in a 2D array. column and row are sorted.
int a[M][N] = {}; //M and N could be any numbers.
How to pass 'a' into your function?
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。