可能重复:
C字符串文字:它们去哪里了?
如果我有以下代码
char *str = "Tryout" ; 
字符串将存储在哪里?堆?如果是堆栈,指针是否指向堆栈位置呢?
我已经得到了这个代码,我不太确定为什么它的行为是未定义的.我的猜测是它与两个字符串的内存位置和if条件中的位置比较有关.
int main(void) { 
  char *str1 = "xyz"; 
  char *str2 = "xyz";
  if (str1 == str2) {
     printf("Same!\n");
  }  else {
     printf("Not Same!\n");
  }
  return 0; 
}
我学习这些概念,请帮助我以下代码抛出分段错误的原因.我在这段代码中的意图是打印大写字母D并移到下一个地址.请解释一下.感谢你.
main()
{
    char *ptr="C programming";
    printf(" %c \n",++*ptr);    
}
我有一个问题是关于如何操作c字符串初始化的正确方法例如下一个代码,并不总是正确的.
char *something;
something = "zzzzzzzzzzzzzzzzzz";
我测试了一点点增加了zetas的数量,并且有效地使程序崩溃了两行,那么这个char数组的实际大小限制是多少?我怎么能确定它不会崩溃,这个限制实现是否依赖?以下代码是否始终必须使用正确的方法?
char something[FIXEDSIZE];
strcpy(something, "zzzzzzzzzzzzzzzzzzz");
/* Note: I've formatted the code for readability. */
const char * getString() {
    const char *x = "abcstring";
    return x;
}
我惊讶地发现返回一个指向文字字符串的指针是有效的,并没有像我想象的那样发生段错误.我总是假设文字被推入堆栈或放入其他一些临时内存,但仅限于函数的范围.但似乎它们比我想象的更静态.然后它们被放入某种字符串池中,它对整个可执行文件是全局的吗?
另外,如果我将字符串文字作为参数传递给函数,是否同样如此?例如:
/* Where is the string literal in this example being placed? */
myfunc(value1, value2, "rainbowdash");
我希望有人能开导我.提前致谢!:)
我想更改malloc、memcpy和free函数,并将此 libhooker 与 LD_PRELOAD 一起使用。
我改变它们,并测试它们的一些测试用例。但在其中之一中,我的代码无法正常工作,并且不知道为什么。
测试用例:
int main()
{
    string s = "Hello";
    return 0;
}
我的代码输出:
malloc[0x8229170-0x8229182]
[memcpy] source address 0x8048850 is not allocated.
free(0x8229170)
我不知道 c 如何为常量字符串分配内存以及为什么我的代码是错误的。
提前致谢。
关于指针和内存分配,我有一些非常基本的问题.
在下面的代码指针c实际指向哪里?换句话说,字符串在哪里"xyz"存储在内存中(堆栈/堆等)?
a因为我不再使用它而将分配给内存位置会发生什么?
如果我取消评论评论部分,代码似乎运作良好.在这种情况下,记忆发生了什么?
#include<stdio.h>
main()
{
    char *c;
    //c = (char *)malloc(2);
    c = "a"; 
    c = "xyz" ; 
    printf("%s",c);
    return 0;
}
输出:
 xyz
编辑:
在阅读了一些答案和第一条评论之后,我想到了另一个问题:
在下面的情况下,字符串存储在哪里?我可以稍后更改它们吗?
  char *c[] = {"a","xyz"};
我有一个可以是"路由器"或"交换机"的设备.我使用下面的函数,传递一个枚举,返回我的字符串.我的问题是whoami的内存是在堆栈上分配的.当此函数devicetype_string完成时,堆栈将被销毁.当我使用指向堆栈上分配的内存的指针时,这不会导致问题吗?
当前代码有效.我只是想了解为什么它的工作原理.我认为更清洁和可移植的解决方案是malloc内存来保持whoami(以便它进入堆)并且调用函数应该释放该内存.
这是目前的计划:
char *devicetype_string (FwdrType devicetype)
{
    char *whoami;
    switch (devicetype)
    {
        case FWDR_TYPE__ROUTER:
            whoami = "Router";
            break;
        case FWDR_TYPE__SWITCH:
            whoami = "Switch";
            break;
        default:
            whoami = "Fwder Type UNKNOWN";
    }
    return whoami;
}
foo()
{
    . . .
    FwderType abc = FWDR_TYPE__ROUTER;
    printf ("%s", devicetype_string(abc));
}
这可能是预期的,但我只是好奇如何/为什么会发生这种情况.
当我尝试使用char *声明的本地char * foo = "\xFF\xFF..."作为整数时,它会出错.但是,如果我使用malloc,当我尝试访问它时,它可以很好地工作.为什么会这样?
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
  unsigned char *buf = malloc(16);
  memcpy(buf, "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 16);
  //unsigned char *buf = "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"; // seg faults if you sue this instead
  uint64_t *k  = (uint64_t *) buf;
  uint64_t *k2 = (uint64_t *) (buf + 8);
  uint64_t i  = 1000000000;
  printf("-k =%" PRIu64 "\n", *k);
  printf("-k2=%" PRIu64 "\n", *k2);
  printf("Iter * %" PRIu64  "\n", …我有一个简单的代码.
#define MY_STRING "String example"
char* string_return_function()
{
    return MY_STRING;
}
上面的代码有效,但我不知道如何.我认为string_return_function()返回一个本地地址,一旦该函数退出就会被释放.