小编ver*_*ose的帖子

在realloc之后使用原始指针?

我正在阅读Richard Reese的新书(2013年5月)O'Reilly的书"理解和使用C指针",我对其中的一些代码有疑问,第87页.

if (++length > maximumLength) {
    char *newBuffer = realloc (buffer, maximumLength += sizeIncrement);

    if (newBuffer == NULL) {
        free (buffer);
        return NULL;
    }

    currentPosition = newBuffer + (currentPosition - buffer);
    buffer = newBuffer;
}
Run Code Online (Sandbox Code Playgroud)

我希望变量的名称是不言自明的; 如果需要上下文,我将编辑以提供整个代码块,而不仅仅是这个摘录.

我的问题是关于这条线currentPosition = newBuffer + (currentPosition - buffer);.我的理解realloc()是,当新分配成功时,最初分配的内存被释放.如果这是正确的,那么有问题的线是使用悬空指针,不是吗?都buffercurrentPosition上表达的RHS是指向存储器已经被释放.

我的直觉是重写这个以避免使用悬挂指针length,这毕竟已经存在了.我想用以下代码替换最后两行:

buffer = newBuffer;
currentPosition = buffer + length;
Run Code Online (Sandbox Code Playgroud)

但是,大概写入的代码是有效的,因为两个指针仍然保存地址(尽管是垃圾),并且这两个地址之间的偏移仍然可以作为重新分配的方式来计算currentPosition.那么我是否只是对此感到不安?

概括问题:一旦指针悬空,为了任何目的使用指针中包含的地址是否安全,例如计算偏移量?谢谢.

c pointers realloc

11
推荐指数
1
解决办法
471
查看次数

下面这段代码做了什么

short rtimer_arch_now(void)
{
  short t1, t2;
  do {
    t1 = TA1R;
    t2 = TA1R;
  } while(t1 != t2);
  return t1;
}
Run Code Online (Sandbox Code Playgroud)

TA1R是Timer_A寄存器.我仍然不明白为什么有一个循环.如果他们想要返回时间,他们只需返回TA1R.循环是什么?

c

10
推荐指数
1
解决办法
861
查看次数

bash:文件测试表达式评估中的双重vs单括号

我对bash中的文件测试表达式有疑问.这是一个简单的脚本来说明我的问题:

set -x
read -p "Enter a filename: " var1
if [ - e $var1 ]
then
    echo file exists
else
    echo file not found
fi
Run Code Online (Sandbox Code Playgroud)

有三种情况:

  1. 在提示符下,我输入 foo,这是一个存在于我正在运行脚本的目录中的文件.正如预期的那样,输出是 file exists.
  2. 在提示符下,我进入 bar.我正在运行脚本的目录中不存在此类文件.正如预期的那样,输出是 file not found.
  3. 在提示符下,我点击时 <enter> 没有输入任何内容.令人惊讶的是,输出是 file exists.

如果我使用 if [[ -e $var1 ]],即双括号而不是单一,行为是正确的:即使在第三种情况下,我得到file not found.

set -x 在文件的顶部插入了一个 以查看发生了什么.使用单括号,变量的计算结果如下: '[' -e ']'.使用double,它被评估为 [[ -e '' ]].这是有趣的.为什么在这两种情况下表达式的评估方式不同?

我将很感激解释.对不起,如果我错过了明显的.谢谢!

bash shell

6
推荐指数
2
解决办法
2894
查看次数

Perl中'foreach'的行为

我刚开始学习Perl,发现自己因以下代码块的结果而受阻:

@x = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
foreach (@x) {
    $x = pop (@x) ;
    $y = shift (@x);
    print ("$x $y \n");
}
Run Code Online (Sandbox Code Playgroud)

输出是:

10 1
9 2
8 3
7 4
Run Code Online (Sandbox Code Playgroud)

我曾预料到另一条线:6 5.为什么没有这样的线?是因为在打印的迭代之后7 4,数组中剩余的元素数量等于已经完成的迭代次数,因此就Perl而言,循环完成了吗?

perl foreach

5
推荐指数
2
解决办法
1269
查看次数

外部如何工作?

extern是C中的存储类.它究竟是如何工作的?下面给出的代码输出是20.这是如何输出的?

#include <stdio.h>

int main()
{
    extern int a;
    printf("%d", a);
    return 0;
}
int a=20;
Run Code Online (Sandbox Code Playgroud)

c c++ extern

4
推荐指数
1
解决办法
3328
查看次数

使用printf而不必转义双引号?

在C是不正常可以使用'printf字符串.但是,我的文字充满双引号",我需要将它们全部转义为

printf("This is \"test\" for another \"text\"");
Run Code Online (Sandbox Code Playgroud)

是否有可能printf在没有逃脱的情况下".我的意思是使用另一个字符来包装字符串.

c printf

3
推荐指数
1
解决办法
5230
查看次数

printf在打印浮点值时崩溃

printf()今天我遇到了一个奇怪的问题.但即使经过分析,我也找不到它的答案.因此在这里分享.我尝试了这三个printf()陈述:

printf("\nValue of this division is %f", (double)873/(double)65);
Run Code Online (Sandbox Code Playgroud)

它按预期打印正确的输出.

printf("\nSome message with an integer here %d followed by floats %f, %f, %f", 2013, 987/432, 873/65, 983/81);
Run Code Online (Sandbox Code Playgroud)

给我错误的值(因为我没有把它们加倍?)

printf("\nSome message with an integer here %d followed by floats %f, %f, %f and now string at end: %s", 2013, 987/432, 873/65, 983/81, "Some trial string here");
Run Code Online (Sandbox Code Playgroud)

printf()在这里坠毁了!这引起了两个问题:

  1. 我在MSDN中看到了"FormatOutput(LPCSTR formatstring,...)"示例,其中它们分配了固定宽度的目标缓冲区,然后vsnprintf()使用它进行调用.我相信printf()在同一条线上工作.但我没有找到任何内部缓冲区大小printf().如果它动态分配内存,那么它如何计算缓冲区大小?

  2. printf()在上面崩溃,因为vsnprintf()那里也崩溃了(是的,我尝试了上面参数FormatOutput给出的示例代码vsnprintf()).但为什么最终会崩溃呢?

c c++ printf

3
推荐指数
1
解决办法
1753
查看次数

Perl:将参数传递给信号处理程序会导致处理程序立即运行

简短版本:我正在尝试将参数传递给信号处理程序.但是,当我这样做时,处理程序会在程序启动后立即运行.为什么会发生这种情况,我该如何纠正呢?

详细信息:我的代码中有以下行:$SIG{ALRM} = \&timesup($number);.信号处理程序本身是:

sub timesup {
    my $num = shift;
    die "Time ran out.\nNumber was: $num\n"
}
Run Code Online (Sandbox Code Playgroud)

当我运行程序时,它会立即运行信号处理程序并使用指定的消息终止.我通过$SIG{ALRM}在行前生成$ number的随机值进行测试.关于死亡的天鹅歌曲消息确实打印了随机值,所以我认为论证本身正在正确传递.但输出是立即的:

bassoon:$ ./myscript.pl

Time ran out.
Number was: 4
Run Code Online (Sandbox Code Playgroud)

如果我拿走了这个论点并且只是$SIG{ALRM} = \&timesup;,那么程序就会按预期工作.但是,在这种情况下,我无法将参数传递给子例程,并且必须使用全局,我宁愿不这样做.

我究竟做错了什么?谢谢你的帮助.

perl signals

3
推荐指数
1
解决办法
895
查看次数

访问结构中的位字段

我是位域概念的新手.我试图访问结构中的元素,但它显示错误aa=v就像这样.

error: incompatible types when assigning to type ‘cc’ from type ‘long unsigned int ’
Run Code Online (Sandbox Code Playgroud)

并且如果我将其类型化,那就显示出错误 aa= (cc)v;

error: conversion to non-scalar type requested
Run Code Online (Sandbox Code Playgroud)

我尝试通过声明指向结构的指针来访问元素.在这种情况下我做得很好,但在这种情况下,我没有声明指向结构的指针,我必须访问元素.我怎样才能克服这个错误.

在此先感谢您的帮助

#include<stdio.h>
typedef struct 
{
        unsigned long a:8;
    unsigned long b:8;
    unsigned long c:8;
    unsigned long d:8;
}cc;


int main()
{ 
        cc aa ;
    unsigned long v = 1458;
    printf("%d\n",sizeof(aa));
    aa=v;    // aa= (cc)v;
    printf("%d %d %d %d\n", aa.a,aa.b,aa.c,aa.d);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c

2
推荐指数
1
解决办法
4600
查看次数

如何在C中扫描完整句子

如何scanf()在不使用fgets()或使用C语句中完整句子gets()

我想从用户扫描命令行,并根据第一个单词识别命令.例如:mkdir

所以我需要认识到用户想要创建一个名为"dir_name"的新目录.

我的代码:

int main(){
  char *ch=malloc(sizeof("50");
  while (strcmp(ch,"exit")!=0){
     scanf("%[^\n]",ch);
  } 
Run Code Online (Sandbox Code Playgroud)

当我输入第一句后输入这段代码然后按回车键进入无限循环我不知道为什么?

c string scanf

2
推荐指数
1
解决办法
3万
查看次数

标签 统计

c ×7

c++ ×2

perl ×2

printf ×2

bash ×1

extern ×1

foreach ×1

pointers ×1

realloc ×1

scanf ×1

shell ×1

signals ×1

string ×1