当函数返回反向字符串的地址时,我无法打印元素

时间:2016-05-01 10:09:32

标签: c string pointers

我最近写了一个函数来反转字符串输入。 例如,输入=" hello",然后输出=" olleh" 我有一个问题,当我返回char *的地址时,它看起来很好,但为什么我不能打印那个指针的字符串?

首先非常感谢,这是我的代码:

//h2[a[@title='Sony Xperia']]
 /following-sibling::div[@class='actions']
 /ul/li/a[text()='Add to Compare']

结果: 0x7fff40db7300 @@

3 个答案:

答案 0 :(得分:2)

不要在函数内部分配Error in as.POSIXct.default(as.character(df$V3), tz = "UTC", format = "%Y-%m-%d %H:%M:%S") : do not know how to convert 'as.character(df$V3)' to class “POSIXct” 。当函数返回时它将超出范围(即它不再有效访问它)。而是在main中分配它并传递指向该函数的指针。类似的东西:

reversechar

将此与 #include <stdio.h> #include <stdlib.h> void reverseString(char* dst, char* s) { int i; int size; size = strlen(s); for(i = 0; i < size; i++) dst[i] = s[size-1-i]; // Terminate the string dst[size] = 0; } int main(void) { char* s = "hello"; char out[strlen(s)+1]; reverseString(out, s); printf("%p %s\n",out,out); return 0; } strcpy等功能进行比较。他们不为你分配内存。它们要求您同时提供源指针和目标指针。

答案 1 :(得分:1)

代码中有几件事情:

- 您尝试返回一个指向具有自动存储持续时间的数组的指针,如果您使用它,则会调用Undefined Behavior。

- 尝试打印指针时,将(void *)强制转换为它。

- 使用strlen()函数获取字符串的长度,而不是sizeof operator`。

您应该在函数内部使用malloc()动态分配数组,并在完成后将其释放。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char* reverseString(char*);

int main(void)
{
    char* s = "hello";
    char* out;

    out = reverseString(s);

    printf("%p %s\n", (void *)out, out);

    free(out);
    return 0;
}

char* reverseString(char* s)
{
    char *reverse;
    size_t i, size;

    size = strlen(s);
    char *reversechar = malloc(size + 1);

    for (i = 1; i < size + 1; i++)
        reversechar[i - 1] = s[size - i];

    reverse = reversechar;
    //printf("%p\n",reverse);
    return reverse;
}

答案 2 :(得分:0)

#include <string.h> // for strlen

char* reverseString(char* s)
{
    int i;
    int size;
    char* reverse;

    // size = sizeof(s);
    // char reversechar[size];
    //  ↓
    size = strlen(s);
    char* reversechar = calloc(size + 1, sizeof(char)); // memory allocation and zero-initialization

    for (i = 1; i < size + 1; i++)
        reversechar[i - 1] = s[size - i];

    reverse = reversechar;
    //printf("%p\n",reverse);
    return reverse; // it is necessary that return value is freed by the caller
}
1. size of string

char* s = "hello world";

Address(64bit)    h  e  l  l  o     w  o  r  l  d  /0
0x00007FFF40DB7300:68 65 6c 6c 6f 20 77 6f 72 6c 64 00

  s・・・0x00007FFF40DB7300
  sizeof(s)・・・8  (64bit)
  strlen(s)・・・11 (string length)

In the case of 「char s[] = "hello world";」

  sizeof(s)・・・12 (allocation size)


2. initialization

char buf[5];
0x0000xxxxx22DD100:CD CD CD CD CD (5bytes)

char* buf = malloc(5);
0x0000xxxxx8212A00:CD CD CD CD CD (5bytes)

char* buf = calloc(5 * sizeof(char));
0x0000xxxxx55A6600:00 00 00 00 00 (5bytes)(zero-values)