为什么我在这里遇到了段故障?需要帮忙。想要将整数放入char指针数组中

时间:2010-11-18 03:30:46

标签: c

#include <stdio.h>

#include <stdlib.h>
int main()
{
    int num = 1;
    char* test[8];
    sprintf(test[0],"%d",num);
    printf("%s\n",test[0]);

}

5 个答案:

答案 0 :(得分:9)

char *test[8]是一个8 char *的数组,或指向字符串的指针,因为你没有指定,所以它们都被设置为垃圾值。所以sprintf正在尝试将数据写入who-know-where。

您应该使用char test[8]代替char分配8 sprintf(test, "%d", num);,然后char *的数组。

更新:如果你想使用char *test = malloc(8 /* see note below */); sprintf(test, "%d", num); 指针,你应该分配空间:

char *

如果你想使用一个char *test[8]; // 8 pointers to strings test[0] = malloc(8); // allocate memory for the first pointer sprintf(test[0], "%d", num); 指针数组,它的工作原理是相同的:

malloc

请注意,您必须分别为test[0]test[7]分别致电snprintf()

此外,如评论中所述,如果您的编译器支持它,您应该使用sprintf。它就像snprintf(test, 8, "%d", num); ,但需要一个额外的参数,即缓冲区的大小:

snprintf

并保证不会占用超出您允许的空间。它更安全,如果你需要,realloc会返回它实际需要的空间量,所以如果你给它的空间太小,你可以malloc(8 * sizeof(char))再试一次。

注意:有人会说这应该是sizeof *test(或sizeof(char))。他们是错的(在我客观正确的意见;注意讽刺)! TYPE *p = malloc(x * sizeof *p)保证为1,因此这种乘法是不必要的。

有些人主张使用sizeof *p,以便在TYPE发生变化时,您只需要在一个地方进行更改,char *就会适应。我是其中一个人,但在我看来,您很少需要将char *升级为其他类型。由于这么多函数使用malloc并且需要在这样的升级中进行更改,因此我并不担心使{{1}}行更灵活。

答案 1 :(得分:3)

sprintf()不为字符串分配空间;你必须事先自己做。

答案 2 :(得分:2)

看看你的警告:

  

test.c: In function ‘main’:
  test.c:8: warning: ‘test[0]’ is used uninitialized in this function

您分配了一个包含8个指针的数组,但在没有初始化的情况下使用一个指针。您必须调用malloc并将结果存储在test[0]中,然后才能写入test[0]指向的内存。你最后free

GNU和BSD中有用的函数是asprintf,它将调用malloc为您分配足够的格式化字符串内存:

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

int main(void) {
    int num = 1;
    char* test[8];
    asprintf(&test[0],"%d",num);
    printf("%s\n",test[0]);
    free(test[0]);
    return 0;
}

(请注意,您将指针的地址传递给asprintf - 因为您的指针为test[0],其地址为&test[0]。)

答案 3 :(得分:-1)

你确实分配了空间但是你传递了错误的东西。试试这个:

#include <stdio.h>

#include <stdlib.h>
int main()
{
    int num = 1;
    char test[8];
    sprintf(test,"%d",num);
    printf("%s\n",test);

}

答案 4 :(得分:-3)

int main()
{
       char *str[5];
       sprintf(str[0], "%d",55);
       printf("%s\n",str[0]);
       return 0;
}

这将是有效的。但是,如果指定变量而不是整数常量值,则会发生分段错误。此错误将在sprintf函数执行时发生。因为用户空间内存访问。