我不能用sprintf()

时间:2014-03-28 00:30:14

标签: c casting printf

我想将int投射到char。 这是我的代码。

#include <stdio.h>
int main(){
        int i = 7;
        char *s;
        sprintf(s,"sprint f = %d",i);
        printf("printf s = [%s]",s); 
} 

结束Segmentation fault。 这有什么不对?

3 个答案:

答案 0 :(得分:3)

您没有为s分配任何内存。它只是一个NULL或指向随机位置的指针(取决于编译器)。试着写信就好像上床睡觉时没有关心你 - 而你刚刚闯入别人家的可能性比随意选择自己的床要大。因此,分段错误 - 计算机逮捕程序的方式。

要分配内存,您可以让编译器为您设置一些(char s[22]),或者分配您自己的(char *s = malloc(22))。

答案 1 :(得分:1)

s是一个无效的指针 - 因此你不能写入它指向的内存(如果有的话),也不能从中读取。为它分配内存:

char s[64];

char* s = malloc(64);

答案 2 :(得分:0)

代码需要内存sprintf()数据。

对于某些嵌入式应用程序,我需要精简,但要容忍int为16,32或可能是64位,所以要正确调整缓冲区的大小:

static const char *format[] = "sprint f = %d";

// Size `s` to be sufficiently large as format and int size may change.
char s[sizeof format + sizeof(int)*3 + 3];

sprintf(s, format, i);
printf("printf s = [%s]",s); 

我喜欢使用sizeof(some_integer_type)*3 + 3来计算整数类型上所有排序所需的内存。

(注:我假设CHAR_BIT == 8作弊)