-3

私が達成しようとしていることの本質は次のとおりです。引数として整数ポインターを期待する関数に、文字列の形式である整数 (整数ポインター) のアドレスを渡したいと思います。簡単なコードに関しては、次のことを行いたいです。

void dsp(int *);

int main() {

  char *b;
  int a=2;p=&a;
  b = (char *)malloc(100*sizeof(char));
  sprintf(b, "%p",p);
  puts( b );
  dsp(&a);
  dsp((int *)strtol(b,16));
  free(b);
return 0;
}

void dsp(int *addr)
{ 
  printf("val:%d\n",*addr);
}

そして、これが私の出力です:

0x7fbffffa6c   (from puts(b))
val:2
Segmentation fault

上記の何が問題なのか、および/またはそれをどのように行うかを誰かが提案できますか? どんな助けでも大歓迎です。ありがとうございました。

4

3 に答える 3

2

long は pointer に適合する必要がないため、ポインターに使用strtolすることはあまり移植性のあるアイデアではありません。探していることを行う最も簡単な方法は、おそらく、使用できる実際のポインター形式を持つものに置き換えることです。sscanf

dsp(&a);
int* recovered_pointer;
sscanf(b, "%p", &recovered_pointer);
dsp(recovered_pointer);

補足として、必要な 3 つのパラメーターすべてを に渡しているわけstrtolではありません。これは、ポインタが収まるのに「十分な長さ」だったとしても機能しません。必要なヘッダー ファイルをインクルードすることは常に良い考えです。この場合、コンパイル時にコードが壊れることをコンパイラが通知するのに役立ちます。

于 2013-02-26T05:35:41.323 に答える
1
dsp((int *)strtol(b,16));

まず、ここにパラメーターがありません。strtol() は 3 つのパラメーターを取ります。おそらくコンパイラの警告が表示されます。それらを無視しないでください!ソースファイルの先頭に適切なものを追加する#includeと、警告がエラーに変わります (これは良いことです)。

#include <stdlib.h>

次に、変数のアドレスを取得できるように、strtol() の結果を変数に格納する必要があります。関数の戻り値のアドレスを取得することはできません。前にキャストを追加して(int *)も、それはできません (ただし、コンパイラが悪いコードを受け入れるように強力に武装します)。

int result;
result = (int) strtol(b, NULL, 16);
dsp(&result);
于 2013-02-26T05:23:10.800 に答える
0

32 ビットおよび 64 ビットの VS2012 コンパイラでテストされた動作コードは次のとおりです。

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

void dsp(int*);

int main()
{
    char *b;
    int* t;
    int a = 2;
    b = malloc(100 * sizeof(char));
    sprintf(b,"%p", &a);
    dsp(&a);
    sscanf(b,"%p",&t);
    dsp(t);
    free(b);
    return 0;
}

void dsp(int* addr)
{
    printf("val:%d\n", *addr);
}
于 2013-02-26T06:04:15.003 に答える