使用long int作为malloc的参数

时间:2017-04-17 14:29:26

标签: c

int main() {
int n;
long u=0,d=0,count=0,i=0;
char *p=(char *)malloc(sizeof(char)*n);
scanf("%ld",&n);
scanf("%s",p);
for(i=0;i<n;i++){
if(p[i]=='U'){
        u=u+1;
    }
    if(p[i]=='D'){
        d=d+1;
    }
   if((d-u)==0 && p[i]=='U'){
       count=count+1;}
}
    printf("%ld",count);
return 0;
}

在这种隐式内存分配的标准语法中,如果我替换&#34; int n;&#34;用&#34; long int n;&#34;
弹出一个错误说:

GDB追踪: 从解决方案中读取符号......完成。 [新LWP 10056] 核心是由“解决方案”生成的。 程序以信号SIGSEGV,分段故障终止。

我到处寻找解决方案,而我完全不知道要搜索什么, 如果有人帮助我,我会很高兴。谢谢 :) (这是在在线编译器上执行的)

2 个答案:

答案 0 :(得分:1)

我想指出一些事情:

  1. 首先,您不必将n声明为“long int”。 “long int”和“long”是相同的。所以,

    long int n; //is same as
    long n;
    
  2. 无论n是“int”还是“long”,malloc()都能正常工作。但是,您似乎没有初始化n。 n的价值是多少? C不执行变量的自动初始化,并且n可能具有垃圾值(甚至是负数),这可能导致程序崩溃。所以请给n值。

    long n = 10; //example
    
  3. 或使用scanf()输入值。 现在在你的代码中,什么是scanf()在“malloc之后”做什么?我假设您打算读取n的值,然后将其传递给malloc。所以请将代码顺序更改为:

        scanf("%ld",&n);
        char *p=(char *)malloc(sizeof(char)*n);
    

    我在我的系统上使用这些更改运行程序,它运行正常(没有分段错误)

    1. malloc()限制:我们知道malloc是从堆中分配的。但我真的没有看到malloc在当前平台上返回NULL(通常是64位)。但是,如果您尝试分配非常大的内存块,malloc可能会返回NULL,这将导致程序崩溃。
    2. 所以最好检查malloc()的返回值,如果是NULL,则采取适当的操作(如重试或退出程序)

      如下所示的支票将始终有用:

          if (p == NULL) {
             printf("Malloc error");
             exit(1);
          }
      

答案 1 :(得分:0)

提取代码的相关部分:

int n;
char *p=(char *)malloc(sizeof(char)*n);

malloc的参数属于size_t,这是一种无符号类型。如果传递任何其他整数类型的参数,它将隐式转换为size_t

您报告说,int n;您没有看到问题,但long int n;您的程序会因分段错误而死亡。

在任何一种情况下,您都会将未初始化的值传递给malloc()。仅仅指未初始化对象的值具有未定义的行为。

您传递给long int的任意malloc()值可能会导致它失败并返回空指针,以后当您尝试取消引用时会导致分段错误指针;任意int值可能恰好导致malloc成功。检查malloc是成功还是失败可能会避免分段错误。

将未初始化的值传递给malloc()是完全没用的事情。根据未初始化的值是int还是long int,它的行为方式不同,这一事实并不是特别重要。

如果您有好奇心,可以在致电n之前添加一行来打印malloc()的值,而肯定应检查{{1}通过返回空指针报告失败。除此之外,您知道代码不正确。不要浪费太多时间来弄清楚 失败的细节(或者更糟糕的是,为什么它有时不会失败)。只需通过将malloc()初始化为您实际想要分配的字节数来修复代码。 (并将n定义为n类型的对象。)

更多要点:

您的问题中的代码缺少几个必需的size_t指令。如果您的实际代码中缺少它们,则应添加它们。如果它们出现在您的实际代码中,您应该将它们包含在您的问题中。不要假设你可以放心地放弃什么。

#include应为int main()。 (这是一个可能没有任何实际差异的小问题。)

int main(void)

这本质上是危险的。它读取一个空格分隔的字符串,可以任意长。如果用户输入的字符数多于缓冲区scanf("%s",p); 可以容纳的字符数,则表明存在未定义的行为。

p

不正确,但更具惯用性地写为u=u+1;

u ++;更清晰,更安全地写为(d-u)==0。 (对于d == ud的极值,减法可能会溢出;相等比较不会出现此问题。)