尝试复制数组C时出现分段错误(核心转储)

时间:2013-04-23 14:51:12

标签: c segmentation-fault

当我运行以下分段错误时......目标是将argv数组复制到allowdip数组。

char *allowdip;
int *allowdipcount;


int main(int argc, char *argv)
{
  int xer;

  allowdipcount = argc;

  for(xer=0; xer<allowdipcount; xer++) {
    allowdip[xer]=argv[xer];
  }

  for(xir=0; xir<allowdipcount -1; xir++) {
    printf("%s\n", allowdip[xir]);
  }


exit(EXIT_SUCCESS);
}

关于我做错的任何想法?

更新

谢谢,现在我的代码是:

char **allowdip;
int allowdipcount;

int main(int argc, char *argv)
{
  int xer;
  int xir;

  allowdipcount = argc;
  char **allowdip = malloc(allowdipcount * sizeof(char*));
  for(xer=0; xer<argc; xer++) {
      allowdip[xer]=argv[xer];
  }

    for(xir=1; xir<allowdipcount; xir++)
    printf("%s\n", allowdip[xir]);
    exit(EXIT_SUCCESS);

}

它返回:

 testscript2.c:51: warning: assignment makes pointer from integer without a cast

第51行包含:

 allowdip[xer]=argv[xer];

2 个答案:

答案 0 :(得分:4)

allowdip是一个未初始化的指针。你需要为它分配内存

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

int main(int argc, char *argv[])
{
  int xer;
  int allowdipcount = argc;
  char **allowdip = malloc(allowdipcount * sizeof(char*));

  for(xer=0; xer<allowdipcount; xer++) {
      allowdip[xer]=argv[xer];
  }

  for(xer=0; xer<allowdipcount; xer++) {
    printf("%s\n", allowdip[xer]);
  }
  free(allowdip);
  return EXIT_SUCCESS;
}

请注意,我在您的代码中进行了一些其他更改

  • allowdipcount应为int类型(否则您也需要为其分配存储空间)
  • allowdip已将类型更改为char指针数组
  • main的签名不太正确 - argv应该是char*数组
  • 将您的全局变量更改为main的本地变量,因为它们并非显然需要全局
  • 更改了printf循环以迭代所有程序参数。它正在你的问题中跳过最后的arg。
  • 释放了我们为allowdip分配的内存
  • Vincent建议的main简化回复

答案 1 :(得分:1)

你没有分配内存,你的类型都错了。

计数器应该是整数,而不是指针:

int allowdipcount;

并且数组应该是一个指针数组,而不是字符:

char **allowdip;

然后你可以分配:

allowdip = malloc(argc * sizeof *allowdip);

并复制数组:

memcpy(allowdip, argv, argc * sizeof *allowdip);

请注意,这不会复制实际的参数字符串,只会复制指向字符串的指针数组。它也不包括终止数组的NULL argv[argc]指针。