将char数组赋给char *

时间:2016-01-16 15:47:55

标签: c arrays string pointers

我试图编写一个以字符串长度为前缀的函数。我似乎无法将char []分配给char *。神秘的是,如果我在分配之前打印出一些调试代码,它就可以工作。

char *prefixMsgWLength(char *msg){
  char *msgWLength;
  int msgLength = strlen(msg);

  if (msgLength == 0){
    msgWLength = "2|";
  }
  else{

    int nDigits = floor(log10(abs(msgLength))) + 1;
    int nDigits2 = floor(log10(abs(msgLength + nDigits + 1))) + 1;

    if (nDigits2 > nDigits){
      nDigits = nDigits2;
    }

    msgLength += nDigits + 1;

    char prefix[msgLength];
    sprintf(prefix, "%d|", msgLength);

    strcat(prefix, msg);
    // if I uncomment the below, msgWLength is returned correctly
    // printf("msg: %s\n", prefix);
    msgWLength = prefix;
  }
  return msgWLength;
}

2 个答案:

答案 0 :(得分:2)

代码中的问题是

 msgWLength = prefix;

在这里,您将局部变量(prefix)的地址分配给指针,然后尝试return它。

一旦函数完成执行,局部变量将超出范围,返回的指针将无效。

您需要将prefix作为指针并动态分配内存,如果您希望它在从函数返回后保留存在

答案 1 :(得分:0)

在C中,将字符串重新分配到精确的长度可能非常麻烦。使用足够大的缓冲区可能会好得多。在这里,我使用limits.h根据系统(LINE_MAX)确定行缓冲区的大小:

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

int main()
{
    /* Our message */
    char const msg[] = "Hello, world!";
    /* Buffer to hold the result */
    char buffer[LINE_MAX];

    /* Prefix msg with length */
    snprintf(buffer, LINE_MAX, "%lu|%s", strlen(msg)+1, msg);

    /* Print result */
    printf("%s\n", buffer);

    return 0;
}