标签: null-pointer

MediaMetadataRetriever getFrameAtTime:videoframe是一个空指针

我试图获取一个视频帧,所以我使用MediaMetadataRetriever.getFrameAtTime(),如下所示:

    Uri directorio = Uri.parse("android.resource://com.extremeye/" + R.raw.video);
    media = new MediaMetadataRetriever();
    media.setDataSource(this, directorio);

    frame = (ImageView)findViewById(R.id.frame);
    Bitmap bmFrame = media.getFrameAtTime();
    frame.setImageBitmap(bmFrame);
Run Code Online (Sandbox Code Playgroud)

但问题是我得到:

MediaMetadataRetriever getFrameAtTime:videoframe是一个空指针

在logCat中.

我确定该视频与Android操作系统兼容并且MediaMetadataRetriever加载它,因为我可以在2.3.3操作系统版本中获得其元数据描述而没有问题.

我不知道为什么我不能得到框架,但如果我使用4.2操作系统版本,它的工作完美.我试图改变编解码器和视频的格式,但它不起作用......我想这是格式兼容性的问题,但我不知道我能做什么...

谢谢!!

media android frame null-pointer

5
推荐指数
1
解决办法
4448
查看次数

打印空指针未定义行为?

在研究这个问题的示例代码时,我假设它是Undefined Behavior,它阻止了后续的std::cout打印使用.但事实证明,尝试打印空指针导致std::ios_base::badbitstd::ios_base::failbit设置在其流状态,这是其不可操作的真正原因.因此,我现在很好奇是否真的(尝试)打印空指针的未定义行为.所以这是我的问题:

  1. 打印空指针是未定义的行为吗?如果是这样,那么流插入器会导致什么呢?我非常确定插入器足够智能,不会取消引用空指针.

  2. 我还想知道为什么插入器在此上下文中遇到空指针时设置其错误掩码(具体而言badbit).为什么它不像字符串文字的终止那样对待它?

我没有标准的方便,到目前为止我只发现了一个来源,不幸导致了一个死链接.

c++ iostream null-pointer undefined-behavior

5
推荐指数
1
解决办法
2449
查看次数

在MSP430上,当我取消引用空指针时会发生什么?

我知道取消引用空指针是未定义的 - 但我想知道在特定目标上发生了什么 - 一个MSP430.

我现在没有一块板可以在我面前加载它来测试它.

如果我这样做(或者类似的话)会发生什么?

int * foo = NULL;
(*foo)++; //Crash?
Run Code Online (Sandbox Code Playgroud)

位置0x0在SFR范围内并保留.

它会产生PUC/POR吗?还是会默默地"工作"?

生成的程序集是

;int * foo = NULL;
clr.w   R15
;(*foo)++;
inc.w   R15
Run Code Online (Sandbox Code Playgroud)

因此,位置0x0实际上是递增1.

当我在模拟器中运行它时,我看到地址0x0的值从0变为1.我在调试日志中没有警告,程序正常退出.

我正在使用IAR EW430编译器/汇编器/模拟器.

c pointers msp430 null-pointer iar

5
推荐指数
1
解决办法
412
查看次数

编译器可以将`execl(prog,arg,(void*)0)`中的`(void*)0`转换为适当类型的空指针吗?

来自Linux编程接口

execl(prog, arg, (char *) 0);
execl(prog, arg, (char *) NULL);
Run Code Online (Sandbox Code Playgroud)

铸造 NULL 在上述上次通话的方式,一般要求,甚至 在其中实现 NULL 被定义为(void *) 0.

这是因为,虽然C标准要求不同类型的空指针在相等性比较时应该测试为真,但它们不要求不同类型的指针具有相同的内部表示(尽管在大多数实现中它们都这样).
并且, 在可变参数函数中,编译器无法强制(void *) 0 转换为适当类型的空指针.

在C类标准有一个例外的规则,不同类型的指针不必具有相同的表示:指针的类型char *,并void *须具有相同的内部表示.这意味着在示例的情况下传递(void *) 0 代替(char *) 0不会成为问题 execl(),但是,在一般情况下,需要强制转换.

  1. " NULL 通常需要以上述最后一次电话的方式进行投射 "

    C标准是否要求空指针表示为(char*) 0

  2. "在变量函数中,例如execl(),编译器无法强制(void *) 0转换为适当类型的空指针."

    (void *) 0不是一个类型的空指针?

    如果是的话,为什么不能编译投(void *) 0execl(prog, arg, (void*) 0) …

c posix pointers null-pointer

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

空指针取消引用不会导致先前语句中的段错误

我正在调试崩溃,其中我们有一个类似于 - 的代码片段

1184 static void
1185 xyz_delete (<struct type1> *c, <struct type2> **a)
1186 {
...
...
...
...
1196    b = *a;
1197    if (!b) {
1198        return;
1199    }
...
...
1203   prev = b->next;
1204   b->next = NULL;
...
...
1245    free_timer(b->active_timer);
...
...
...
     }  
Run Code Online (Sandbox Code Playgroud)

我们碰巧看到了崩溃——分段错误;其调用堆栈如下所示 -

#1  0x456789123 in __free [__be___free] (ptr=<optimized out>, saved_caller_pc=0x123456789 , attr=0x0) at free.c:1234
#2  0x345678912 in xyz_delete  [__be_xyz_delete...] (c=c@entry=0x234567891, a=a@entry=0x0) at myfile.c:1245
#3  0x455678912 in abc (apple=0x52453545, a=<optimized out>, …
Run Code Online (Sandbox Code Playgroud)

c gdb null-pointer

5
推荐指数
1
解决办法
559
查看次数

NULL直接传递给期望const引用参数的函数(VC++ 4.2)

我正在寻找一些我在旧代码库中发现的东西,我很困惑.

这是一个函数定义:

void vUpdateSequenceDetailsAndIncrement(
            const CallEvent& roCPEvent,
            const CallInfo& roCallInfo,
            BOOL bCreationEvent);
Run Code Online (Sandbox Code Playgroud)

这里被称为:

vUpdateSequenceDetailsAndIncrement(roCPEvent, NULL, FALSE);
Run Code Online (Sandbox Code Playgroud)

这里NULL直接传递给引用参数roCallInfo.这个函数最终调用:

vTimeChange(*pSeqDetails, roCPEvent, roCallInfo);
Run Code Online (Sandbox Code Playgroud)

定义如下:

void vTimeChange(const SequenceDetails& roSequenceDetails,
        const CallEvent& roCPEvent,
        const CallInfo& roCallInfo)
Run Code Online (Sandbox Code Playgroud)

再次将可能的NULL值传递给roCallInfo.我以为NULL不能作为引用传递?有谁知道VC++ 4.x是否有某种问题导致这种代码没问题?如果NULL可以作为引用传递,那么在vTimeChange中会发生这样的事情:

roCallInfo.getCallStartTime(); 
Run Code Online (Sandbox Code Playgroud)

这不是我取消引用NULL的方式,就像我要做的那样

CallInfo * info = NULL;
info->getCallStartTime();
Run Code Online (Sandbox Code Playgroud)

?我可能会在那里放一个警卫,让编译器删除它,如果没有必要,但我想深究这是怎么回事!

谢谢.

c++ reference null-pointer visual-c++

4
推荐指数
2
解决办法
8987
查看次数

为什么va_arg在char*类型的变量参数列表的末尾返回NULL?

这就是va_arg以下知名链接中所说的内容:

http://www.cplusplus.com/reference/cstdarg/va_arg/

Notice also that va_arg does not determine either whether the retrieved argument is the last argument passed to the function (or even if it is an element past the end of that list). The function should be designed in such a way that the number of parameters can be inferred in some way by the values of either the named parameters or the additional arguments already read.

除此之外,在我读过的那本书中va_arg,所有的例子都确保其中一个fixed参数始终是我们要传递的变量参数的数量/数量.这个计数用在一个循环中进入va_arg下一个项目,并且循环条件(使用计数)确保它在va_arg检索变量列表中的最后一个参数时退出.这似乎证实了上述段落的说明 …

c variadic-functions null-pointer

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

在定义明确的c ++中,从引用获取的指针是否可以为null?

这个问题是由于检查指针值nullptr受到clang和gcc 的不均衡处理而引起的。因为this它们都发出警告,但是对于address-of在对象上使用运算符获取的指针,它们保持安静。

我很确定这样的指针应该一直有效,因为现代编译器从快乐的90年代实际上取消了对c ++代码的检查,导致了我们遇到的错误。

令我感到困惑的是,为什么编译器在一般情况下保持安静。是否可以通过某种方式if触发,或者这仅仅是两个主要编译器中的设计决策?在开始编写补丁或调试编译器开发人员之前,我想确保我没有错过任何内容。

玩具示例

#include <iostream>
class A {
    void f(){
        if(!this) {
            std::cout << "This can't trigger, and compilers warn about it.";
        }
    }
};

void f(A& a){
    A* ptr = &a;
    if(ptr == nullptr) {
        std::cout << "Can this trigger? Because gcc and clang are silent.";
    }
}
Run Code Online (Sandbox Code Playgroud)

尽管这个问题看起来很愚蠢,但我发现它很实用。如果使用臭代码工作,则此优化将导致致命的结果,因此警告将是非常有用的诊断。

以补充情况。clang和gcc都知道检查具有不变的评估能力,因为即使对于干净的代码:

void g(A* a){
    A* ptr = a;
    if(ptr == nullptr) {
        std::cout << "Gee, can …
Run Code Online (Sandbox Code Playgroud)

c++ pointers reference null-pointer language-lawyer

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

c++中值0的特殊状态是什么?

这纯粹是一个哲学问题。我认为没有合理的上下文可以证明结果是有用的(给定nullptr)。

根据这个 - https://en.cppreference.com/w/cpp/language/integer_literal,整数文字的类型是int, long int, long long int, unsigned int, unsigned long intor unsigned long long int,如果文字的值没有,则可能有特定于实现的例外适合以上任何一种。这些类型都不能转换为void *,除非文字的值为 0。

不同的编译器对此有不同的处理方式。例如,考虑以下转换:

void g(void * p){}

void f(){
    int i = 0;
    void * p;
    // p = i; // Fails. Also for other integral types.

    p = 0; // Works. Also for 00, 0x0 and 0b0. Also when adding `u` and `l` suffixes.
    g(0); // Also works.    
    // …
Run Code Online (Sandbox Code Playgroud)

c++ literals null-pointer

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

三个问题:NULL - NULL 定义了吗?是否已定义 (uintptr_t)NULL - (uintptr_t)NULL?

  1. NULL - NULL定义为。?

  2. (char *)NULL - (char *)NULL定义为。?

  3. (uintptr_t)NULL - (uintptr_t)NULL定义为?

我知道它适用于我使用的所有实现。但从标准的角度来看,它是什么样子的呢?我找不到明确的答案。

编辑:从骗子看来,我认为问题的一个答案是:是的。

那么第二个问题和第三个问题呢?

c pointer-arithmetic null-pointer language-lawyer

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