相关疑难解决方法(0)

Char*指针初始化

可能重复:
C字符串文字:它们去哪里了?

如果我有以下代码

char *str = "Tryout" ; 
Run Code Online (Sandbox Code Playgroud)

字符串将存储在哪里?堆?如果是堆栈,指针是否指向堆栈位置呢?

c c++

2
推荐指数
1
解决办法
1930
查看次数

为什么在C中未定义此代码的行为?

我已经得到了这个代码,我不太确定为什么它的行为是未定义的.我的猜测是它与两个字符串的内存位置和if条件中的位置比较有关.

int main(void) { 
  char *str1 = "xyz"; 
  char *str2 = "xyz";

  if (str1 == str2) {
     printf("Same!\n");
  }  else {
     printf("Not Same!\n");
  }
  return 0; 
}
Run Code Online (Sandbox Code Playgroud)

c undefined-behavior

2
推荐指数
1
解决办法
168
查看次数

带字符串的指针算术

我学习这些概念,请帮助我以下代码抛出分段错误的原因.我在这段代码中的意图是打印大写字母D并移到下一个地址.请解释一下.感谢你.

main()
{
    char *ptr="C programming";
    printf(" %c \n",++*ptr);    
}
Run Code Online (Sandbox Code Playgroud)

c pointers

2
推荐指数
1
解决办法
3557
查看次数

C中的初始化字符串

我有一个问题是关于如何操作c字符串初始化的正确方法例如下一个代码,并不总是正确的.

char *something;
something = "zzzzzzzzzzzzzzzzzz";
Run Code Online (Sandbox Code Playgroud)

我测试了一点点增加了zetas的数量,并且有效地使程序崩溃了两行,那么这个char数组的实际大小限制是多少?我怎么能确定它不会崩溃,这个限制实现是否依赖?以下代码是否始终必须使用正确的方法?

char something[FIXEDSIZE];
strcpy(something, "zzzzzzzzzzzzzzzzzzz");
Run Code Online (Sandbox Code Playgroud)

c arrays initialization char

1
推荐指数
1
解决办法
496
查看次数

文字字符串放在哪里,为什么我可以返回它们的指针?

我偶然发现在这个函数的回答这个问题:

/* Note: I've formatted the code for readability. */
const char * getString() {
    const char *x = "abcstring";
    return x;
}
Run Code Online (Sandbox Code Playgroud)

我惊讶地发现返回一个指向文字字符串的指针是有效的,并没有像我想象的那样发生段错误.我总是假设文字被推入堆栈或放入其他一些临时内存,但仅限于函数的范围.但似乎它们比我想象的更静态.然后它们被放入某种字符串池中,它对整个可执行文件是全局的吗?

另外,如果我将字符串文字作为参数传递给函数,是否同样如此?例如:

/* Where is the string literal in this example being placed? */
myfunc(value1, value2, "rainbowdash");
Run Code Online (Sandbox Code Playgroud)

我希望有人能开导我.提前致谢!:)

c string constants literals placement

1
推荐指数
1
解决办法
181
查看次数

c如何为常量字符串分配内存?

我想更改mallocmemcpyfree函数,并将此 libhooker 与 LD_PRELOAD 一起使用。
我改变它们,并测试它们的一些测试用例。但在其中之一中,我的代码无法正常工作,并且不知道为什么。
测试用例:

int main()
{
    string s = "Hello";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的代码输出:

malloc[0x8229170-0x8229182]
[memcpy] source address 0x8048850 is not allocated.
free(0x8229170)
Run Code Online (Sandbox Code Playgroud)

我不知道 c 如何为常量字符串分配内存以及为什么我的代码是错误的。
提前致谢。

c++ string allocation memcpy ld-preload

1
推荐指数
1
解决办法
932
查看次数

char*指向哪里?

关于指针和内存分配,我有一些非常基本的问题.

  1. 在下面的代码指针c实际指向哪里?换句话说,字符串在哪里"xyz"存储在内存中(堆栈/堆等)?

  2. a因为我不再使用它而将分配给内存位置会发生什么?

  3. 如果我取消评论评论部分,代码似乎运作良好.在这种情况下,记忆发生了什么?

    #include<stdio.h>
    
    main()
    {
        char *c;
        //c = (char *)malloc(2);
        c = "a"; 
        c = "xyz" ; 
        printf("%s",c);
        return 0;
    }
    
    Run Code Online (Sandbox Code Playgroud)

输出:

 xyz
Run Code Online (Sandbox Code Playgroud)

编辑:

在阅读了一些答案和第一条评论之后,我想到了另一个问题:

  1. 在下面的情况下,字符串存储在哪里?我可以稍后更改它们吗?

      char *c[] = {"a","xyz"};
    
    Run Code Online (Sandbox Code Playgroud)

c

1
推荐指数
1
解决办法
107
查看次数

这是内存泄漏,因为内存是在堆栈上分配的吗?

我有一个可以是"路由器"或"交换机"的设备.我使用下面的函数,传递一个枚举,返回我的字符串.我的问题是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));
}
Run Code Online (Sandbox Code Playgroud)

c memory heap stack memory-management

1
推荐指数
1
解决办法
99
查看次数

堆栈上的char数组导致seg错误

这可能是预期的,但我只是好奇如何/为什么会发生这种情况.

当我尝试使用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", …
Run Code Online (Sandbox Code Playgroud)

c arrays malloc

1
推荐指数
1
解决办法
100
查看次数

从C函数返回字符串

我有一个简单的代码.

#define MY_STRING "String example"

char* string_return_function()
{
    return MY_STRING;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码有效,但我不知道如何.我认为string_return_function()返回一个本地地址,一旦该函数退出就会被释放.

c stack memory-management

1
推荐指数
1
解决办法
69
查看次数