linux 下运行c出现段错误!!
#include<stdio.h>#include<string.h>voidreverse(char*ch);intmain(void){char*c="hello";...
#include <stdio.h>
#include <string.h>
void reverse(char * ch);
int main(void) {
char * c = "hello";
printf("before reverse:\n %s \n",c);
reverse(c);
printf("after reverse:\n %s \n",c);
return 0;
}
void reverse(char * a)
{
int len = strlen(a);
int i;
char ctemp;
for (i = 0; i < len / 2; i++)
{
ctemp = a[i];
a[i] = a[len - i -1];
a[len -i -1] = ctemp;
// a[len - i - 1] ^= a[i];
// a[i] ^= a[len - i - 1];
// a[len - i - 1] ^= a[i];
}
}
用gdb调试的时候,发现问题出现在这一行: a[i] = a[len - i -1];
应该是访问了一段未分配的内存,但是我在windows的cygwin下运行是正常的额,本人之前是做java开发的,最近几天刚学c,哪位兄台帮忙指点一下,谢谢~~~
多谢各位的回答,以下是我的理解:
char * c = "hello";这个是告诉编译器,请求开辟一段空间放指针c,指向字符串常量“hello”,此时“hello”位于常量区,因而不能修改,而c的值就是‘h’的地址。
char s[] = "hellp";这个是告诉编译器,请求开辟一段空间放字符数组s,并把字符串常量“hello”的值拷贝到字符数组中,此时该数组的值是可以修改的,但是修改的并不是原来的字符串常量“hello”。
难怪我运行完之后过几秒360就报告说我的程序是木马,不过为什么cygwin下能正常运行,还是没完全明白~~ 展开
#include <string.h>
void reverse(char * ch);
int main(void) {
char * c = "hello";
printf("before reverse:\n %s \n",c);
reverse(c);
printf("after reverse:\n %s \n",c);
return 0;
}
void reverse(char * a)
{
int len = strlen(a);
int i;
char ctemp;
for (i = 0; i < len / 2; i++)
{
ctemp = a[i];
a[i] = a[len - i -1];
a[len -i -1] = ctemp;
// a[len - i - 1] ^= a[i];
// a[i] ^= a[len - i - 1];
// a[len - i - 1] ^= a[i];
}
}
用gdb调试的时候,发现问题出现在这一行: a[i] = a[len - i -1];
应该是访问了一段未分配的内存,但是我在windows的cygwin下运行是正常的额,本人之前是做java开发的,最近几天刚学c,哪位兄台帮忙指点一下,谢谢~~~
多谢各位的回答,以下是我的理解:
char * c = "hello";这个是告诉编译器,请求开辟一段空间放指针c,指向字符串常量“hello”,此时“hello”位于常量区,因而不能修改,而c的值就是‘h’的地址。
char s[] = "hellp";这个是告诉编译器,请求开辟一段空间放字符数组s,并把字符串常量“hello”的值拷贝到字符数组中,此时该数组的值是可以修改的,但是修改的并不是原来的字符串常量“hello”。
难怪我运行完之后过几秒360就报告说我的程序是木马,不过为什么cygwin下能正常运行,还是没完全明白~~ 展开
3个回答
展开全部
我猜想错误的原因是:
char * c = "hello";//该c是一个指针,指向“hello”
reverse(c);
函数
void reverse(char * a)
{
int len = strlen(a);//该strlen函数是计算a的长度,以'\n'为结束,所以len可能不是5;
char * c = "hello";//该c是一个指针,指向“hello”
reverse(c);
函数
void reverse(char * a)
{
int len = strlen(a);//该strlen函数是计算a的长度,以'\n'为结束,所以len可能不是5;
更多追问追答
追问
c语言的字符数组会以'\0'作为结束符,只是在那一段内存的末尾做一个标志吧,不会计算到字符数组的长度里的,所以strlen(a)返回的是5.关键是我的在xp的sygwin下运行的正常,到fedora14 下运行就段错误,纠结啊~~
追答
char *p = "hello"
char *p等价于const char *p,定义的是指向const char类型的指针,也就是说P所指向的内容是只读的,所以你不能用p[0] = ’H’企图对P所指向的字符串重新赋值
这种定义由右向左读,首先P是一个指针,其次是一个指向char的 指针,然后const修饰char,所以char是只读的,好理解吧
char * const p 这个就是指向char的const指针,P一旦赋值将不能再让P指向其他,但是P所指向的内容是可写的
我这里做了测试:
char cStr[] = "hello";
char *c = cStr;
这样就不会出现内存错误了
展开全部
改吧,char *c="hello"--->char c[]="hello"
前者你是不能修改hello的值的,因为hello是常量c只是指向这段内存
而后者确是一个字符数组c里面保存的是"hello"
两都的区别能分出来吧。。。
前者你是不能修改hello的值的,因为hello是常量c只是指向这段内存
而后者确是一个字符数组c里面保存的是"hello"
两都的区别能分出来吧。。。
更多追问追答
追问
多谢~~可是上面这段程序在cygwin下可以正常编译和运行啊,这是怎么回事呢
追答
cygwin是模拟环境吧,可能 具体我也没用cygwin但是linux上应该是不行的,你cygwin是在windows上运行 的吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
地址是无法完成内容互换的。
追问
a[i] = a[len - i -1];此时a[i]和a[len -i -1]都是char的值啊,不是指针~~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询