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,分段故障终止。
我到处寻找解决方案,而我完全不知道要搜索什么, 如果有人帮助我,我会很高兴。谢谢 :) (这是在在线编译器上执行的)
答案 0 :(得分:1)
我想指出一些事情:
首先,您不必将n声明为“long int”。 “long int”和“long”是相同的。所以,
long int n; //is same as
long n;
无论n是“int”还是“long”,malloc()都能正常工作。但是,您似乎没有初始化n。 n的价值是多少? C不执行变量的自动初始化,并且n可能具有垃圾值(甚至是负数),这可能导致程序崩溃。所以请给n值。
long n = 10; //example
或使用scanf()输入值。 现在在你的代码中,什么是scanf()在“malloc之后”做什么?我假设您打算读取n的值,然后将其传递给malloc。所以请将代码顺序更改为:
scanf("%ld",&n);
char *p=(char *)malloc(sizeof(char)*n);
我在我的系统上使用这些更改运行程序,它运行正常(没有分段错误)
所以最好检查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 == u
和d
的极值,减法可能会溢出;相等比较不会出现此问题。)