以下代码在第2行接收seg错误:
char *str = "string";
str[0] = 'z'; // could be also written as *str = 'z'
printf("%s\n", str);
Run Code Online (Sandbox Code Playgroud)
虽然这非常有效:
char str[] = "string";
str[0] = 'z';
printf("%s\n", str);
Run Code Online (Sandbox Code Playgroud)
经过MSVC和GCC测试.
如果我在if语句中定义一个数组,那么在编译期间会分配内存,例如.
if(1)
{
int a[1000];
}
else
{
float b[1000];
}
Run Code Online (Sandbox Code Playgroud)
然后2 * 1000为ints + 4 * 1000浮点数的内存分配?
我试图理解C中的堆栈帧,所以我写了一个简单的C代码来分析堆栈帧.
首先,fun1()返回一个局部变量的地址,该地址变量被初始化为10到ptr,这会导致警告但是没关系...如果我打印*ptr的值现在它打印10,即使这很好.. .
接下来fun2()返回一个甚至没有初始化的局部变量的地址,如果我尝试打印*ptr的值,现在它打印10,无论我是否返回a或b的地址...
为了理解这里发生了什么,我使用了gdb.使用gdb,我开始一步一步调试,当我到达fun2()中的" return&a " 行时,我试图打印b的地址,打印&b但是打印 不能取"b"的地址不是一个左值.
我不明白,当我尝试打印a的地址,打印和打印绝对精细,然后为什么不b的地址.*为什么a不是一个左值?
# include <stdio.h>
int * fun1() {
int a = 10;
return &a;
}
int * fun2()
{
int a;
int b;
return &a; // return &b;
}
int main ()
{
int *ptr;
ptr = fun1();
ptr = fun2();
printf ("*ptr = %d, fun2() called...\n", *ptr);
return 0;
}
Run Code Online (Sandbox Code Playgroud) Coincise问题:需要能够在c ++中修改char*的内容.
我有一个类似这样的函数:char*buffer =(char*)FUNCTION
现在我需要修改'缓冲',例如做这样的缓冲区[1] ="h";
我尝试过的是以下内容:char*string ="Hello World"; char buffer [65]; //我仍然需要知道确切的大小strcpy(buffer,string); buffer [1] ="r";
我也尝试过malloc.不幸的是,编译器总是抱怨以下内容:"无法从const char [2]转换为char".这发生在Windows上.我对g ++编译器没有这个问题.
我查看了以下链接,但仍然无法做任何事情. http://www.developerweb.net/forum/archive/index.php/t-3517.html 关于C中的字符指针 是否可以修改C中的字符串?
谢谢
显然,所有本地数组(未动态分配)都在堆栈中,但是也是位于堆栈上的全局数组?
其他类型的全局变量都在堆上,但我得到的提示是数组是一个不同的故事,并分配在堆栈的底部.那是真的吗?
同样,我不是在谈论总是在堆上的动态分配的.